【问题标题】:Initializing a C# array with multiple copies of the same element使用同一元素的多个副本初始化 C# 数组
【发布时间】:2011-11-10 15:18:08
【问题描述】:

在 C++ 标准模板库 (STL) 中,例如,可以使用以下构造函数创建由同一元素的多个副本组成的向量:

std::vector<double> v(10, 2.0);

这将创建一个包含 10 个双精度的向量,最初设置为 2.0。

我想在 C# 中做类似的事情,更具体地说,创建一个 n 双精度数组,所有元素都初始化为相同的值 x

我想出了以下单行,依赖于泛型集合和 LINQ:

double[] v = new double[n].Select(item => x).ToArray();

但是,如果外人会阅读此代码,我认为不会立即看出该代码的实际作用。我也关心性能,我想通过 for 循环初始化数组元素会更快(尽管我没有检查过)。有人知道执行此任务的更清洁和/或更有效的方法吗?

【问题讨论】:

标签: c# arrays linq


【解决方案1】:

这个怎么样?

double[] v = Enumerable.Repeat(x, n).ToArray();

编辑:我刚刚做了一个小基准测试;要创建 1000 个数组,每个数组包含 100000 个元素,使用循环的速度大约是 Enumerable.Repeat 的 3 倍。

Repeat 
00:00:18.6875488 

Loop 
00:00:06.1628806 

所以如果性能很关键,你应该更喜欢循环。

【讨论】:

  • 谢谢,Thomas,Enumerable.Repeat 方法对我来说是新的。也感谢基准;刚刚出于好奇,我自己也做了同样的事情,得出了大致相同的结论。
  • @Thomas @Anders:ToArray 首先创建一个List,然后填充它,然后使用 List 的大小创建最终数组。这可能是它慢得多的原因(以及为什么如果可能我更喜欢使用ToList 而不是ToArray
  • @xanatos,不,这不是ToArray 所做的;看看使用 Reflector 或其他反编译器的实现...问题是元素的数量最初是未知的,所以它从一个小数组开始,填充它,创建一个更大的数组并从较小的数组复制项目,填充更大的数组等。它涉及大量的数组创建和复制,这就是它如此缓慢的原因。而且 ToArray 并没有明显比 ToList 慢...实际上它们可能具有大致相同的性能特征
  • @Thomas 虽然从技术上讲,它在内部使用称为Buffer&lt;T&gt; 的结构,如果源不是ICollection&lt;T&gt;Buffer&lt;T&gt; 的工作方式与我所说的完全一样。查看Buffer 构造函数和Buffer.ToArray
  • @xanatos,我又检查了一遍;在Buffer&lt;T&gt; 结构中没有List&lt;T&gt; 的踪迹...
【解决方案2】:
var arr = Enumerable.Repeat(x, n).ToArray();

不过,就我个人而言,我只会使用常规的数组循环:

var arr = new double[n];
for(int i = 0 ; i < arr.Length ; i++) arr[i] = x;

更多字符,但数组明显从一开始就具有正确的大小 - 没有迭代增长 List&lt;T&gt; 样式和最终复制回来。还;只是更直接 - JIT 可以做很多事情来优化 for(int i = 0 ; i &lt; arr.Length ; i++) 模式(对于数组)。

【讨论】:

  • 谢谢,马克,我不知道 Enumerable.Repeat。是的,正如 Thomas 也指出的那样,for 循环似乎提供了最好的性能。
【解决方案3】:
double[] theSameValues = Enumerable.Repeat(2.0, 10).ToArray();

【讨论】:

  • 谢谢,sllev,我以前不知道这种方法。
【解决方案4】:

for each(或更好的经典 for)总是比使用 Linq 快得多。 只有在使代码更具可读性时才应使用 Linq 表达式

【讨论】:

  • 谢谢,马西米利亚诺。是的,当我自己进行基准测试时,很明显,从性能的角度来看,for 循环更可取。最后,这可能就是我要降落的地方。
【解决方案5】:

在 VB.NET 中

导入 System.Linq

Dim n As Integer = 10

Dim colorArray = New Color(n - 1) {}.[Select](Function(item) Color.White).ToArray()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多