在C++标准模板库(STL)中,可以使用此构造函数创建一个由同一元素的多个副本组成的向量:
std::vector<double> v(10, 2.0);
Run Code Online (Sandbox Code Playgroud)
这将创建10个双精度矢量,最初设置为2.0.
我想在C#中做类似的事情,更具体地说,创建一个n个双精度数组,所有元素都初始化为相同的值x.
我提出了以下单线程,依赖于泛型集合和LINQ:
double[] v = new double[n].Select(item => x).ToArray();
Run Code Online (Sandbox Code Playgroud)
但是,如果局外人会阅读此代码,我认为代码实际上不会立即显现.我也关注性能,我想通过for循环初始化数组元素会更快(虽然我没有检查过).有人知道更清洁和/或更有效的方法来执行此任务吗?
Tho*_*que 38
那这个呢?
double[] v = Enumerable.Repeat(x, n).ToArray();
Run Code Online (Sandbox Code Playgroud)
编辑:我刚刚做了一个小基准; 要创建1000个每个100000个元素的数组,使用循环的速度要快3倍Enumerable.Repeat
.
Repeat
00:00:18.6875488
Loop
00:00:06.1628806
Run Code Online (Sandbox Code Playgroud)
因此,如果性能至关重要,您应该更喜欢循环.
var arr = Enumerable.Repeat(x, n).ToArray();
Run Code Online (Sandbox Code Playgroud)
就个人而言,我只是使用常规数组循环:
var arr = new double[n];
for(int i = 0 ; i < arr.Length ; i++) arr[i] = x;
Run Code Online (Sandbox Code Playgroud)
更多的角色,但阵列从一开始就证明了正确的尺寸 - 没有迭代增长List<T>
型和最终版本.也; 更直接 - JIT可以做很多事情来优化for(int i = 0 ; i < arr.Length ; i++)
模式(对于数组).