使用同一元素的多个副本初始化C#数组 在C++标准模板库(STL)中,可以使用这个构造器:< /P>创建一个由同一元素的多个副本组成的向量。 std::vector<double> v(10, 2.0);

使用同一元素的多个副本初始化C#数组 在C++标准模板库(STL)中,可以使用这个构造器:< /P>创建一个由同一元素的多个副本组成的向量。 std::vector<double> v(10, 2.0);,c#,arrays,linq,C#,Arrays,Linq,然而,如果一个局外人阅读了这段代码,我认为这段代码的实际功能不会立即显现出来。我还担心性能,我认为通过for循环初始化数组元素会更快(尽管我没有检查)。有人知道一种更干净和/或更有效的方法来完成这项任务吗?这是怎么回事 double[] v = Enumerable.Repeat(x, n).ToArray(); 编辑:我只是做了一个小基准;要创建每个100000个元素的1000个数组,使用循环的速度大约是可枚举的3倍。重复 Repeat 00:00:18.6875488 Loop 0

然而,如果一个局外人阅读了这段代码,我认为这段代码的实际功能不会立即显现出来。我还担心性能,我认为通过for循环初始化数组元素会更快(尽管我没有检查)。有人知道一种更干净和/或更有效的方法来完成这项任务吗?

这是怎么回事

double[] v = Enumerable.Repeat(x, n).ToArray();
编辑:我只是做了一个小基准;要创建每个100000个元素的1000个数组,使用循环的速度大约是可枚举的3倍。重复

Repeat 
00:00:18.6875488 

Loop 
00:00:06.1628806 
因此,如果性能至关重要,您应该更喜欢循环

var arr = Enumerable.Repeat(x, n).ToArray();
就我个人而言,我只会使用常规数组循环,不过:

var arr = new double[n];
for(int i = 0 ; i < arr.Length ; i++) arr[i] = x;
var arr=new double[n];
对于(int i=0;i
更多字符,但从一开始就可以证明数组的大小是正确的-没有迭代增长
列表
-样式和最终副本。也;更直接——JIT可以大大优化(int i=0;i模式(数组)。

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

double[] theSameValues = Enumerable.Repeat(2.0, 10).ToArray();
导入系统

Dim n As Integer = 10

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

非常适合这种使用场景。谢谢,Mark,我不知道Enumerable.Repeat。是的,正如Thomas所指出的,for循环似乎提供了最好的性能。谢谢,Thomas,可枚举。重复方法对我来说是新的。也感谢你的基准;刚才出于好奇,我自己也做了同样的事情,得出了大致相同的结论。@Thomas@Anders:ToArray
首先创建一个
列表,然后填充它,然后使用列表的大小创建最后一个数组。这可能是它速度慢得多的原因(如果可能的话,我更喜欢使用
ToList
而不是
ToArray
)@xanatos,不,这不是
ToArray
的功能;看看反射器或其他反编译器的实现。。。问题是,元素的数量最初是未知的,因此它从一个小数组开始,填充它,创建一个较大的数组,然后从较小的数组复制项目,填充较大的数组,等等。它涉及大量的数组创建和复制,这就是它如此缓慢的原因。ToArray并没有明显比ToList慢。。。实际上,它们的性能可能大致相同characteristics@Thomas虽然从技术上讲,它在内部使用一个名为
Buffer
的结构,但如果源代码不是
ICollection
Buffer
的工作原理与我所说的完全相同。看看
Buffer
构造函数和
Buffer;在
缓冲区
结构中没有
列表
的痕迹…谢谢,斯列夫,我以前不知道这个方法。谢谢,马西米利亚诺。是的,当我自己进行基准测试时,从性能的角度来看,for循环更可取,这一点非常明显。最后,我可能会在这里着陆。
Dim n As Integer = 10

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