使用相同元素的多个副本初始化C#数组

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

std::vector v(10, 2.0); 

这将创建10个双打的向量,最初设置为2.0。

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

我提出了以下单行程序,依赖于generics集合和LINQ:

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

但是,如果局外人会阅读此代码,我认为代码实际上不会立即显现。 我也关注性能,我想通过for循环初始化数组元素会更快(虽然我没有检查过)。 有没有人知道更清洁和/或更有效的方法来执行这项任务?

那这个呢?

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

编辑:我刚刚做了一个小基准; 要创建1000个每个100000个元素的数组,使用循环比Enumerable.Repeat快大约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; 

更多的字符,但arrays从一开始就certificate了正确的大小 - 没有迭代增长的List风格和最终的副本。 也; 更简单 - JIT可以做很多事情来优化for(int i = 0 ; i < arr.Length ; i++)模式(对于数组)。

 double[] theSameValues = Enumerable.Repeat(2.0, 10).ToArray(); 

在VB.NET中

importSystem.Linq

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

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