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

时间:2011-09-05 13:11:43

标签: c# arrays linq

在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 循环来初始化数组元素会更快(尽管我还没有检查过)。有人知道更清洁和/或更有效的方法来执行这项任务吗?

5 个答案:

答案 0 :(得分:36)

这个怎么样?

double[] v = Enumerable.Repeat(x, n).ToArray();
编辑:我刚刚做了一个小基准;要创建1000个每个100000个元素的数组,使用循环比Enumerable.Repeat快3倍。

Repeat 
00:00:18.6875488 

Loop 
00:00:06.1628806 

因此,如果性能至关重要,您应该更喜欢循环。

答案 1 :(得分:7)

var arr = Enumerable.Repeat(x, n).ToArray();

就个人而言,我只是使用常规数组循环:

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

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

答案 4 :(得分:-2)

在VB.NET中

导入System.Linq

Dim n As Integer = 10

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