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