使用相同元素的多个副本初始化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表达式