在 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 循环初始化数组元素会更快(尽管我没有检查)。有人知道执行此任务的更清洁和/或更有效的方法吗?
这个怎么样?
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;
更多的字符,但数组从一开始就明显是正确的大小 - 没有迭代增长
List<T>
风格和最终复制回来。还;更直接 - JIT 可以做很多事情来优化 for(int i = 0 ; i < arr.Length ; i++)
模式(对于数组)。
.NET 的更高版本引入了
Array.Fill
方法。查看用法:
double[] v = new double[n];
Array.Fill(v, 2.0);
double[] theSameValues = Enumerable.Repeat(2.0, 10).ToArray();
合并为一个扩展
/// <summary>
/// Multiply text x times and return it as string array
/// if merge enabled, merge array items in to one string
/// <code>
/// @example
/// var arr = "ab".Repeat(3, false); > out: {"ab", "ab", "ab"};
/// var str = "ab".Repeat(3, true)[0]; > out: "ababab";
/// </code>
/// </summary>
public static string[] Repeat(this string str, int count, bool merge) {
return merge ?
new string[] { string.Concat(Enumerable.Repeat(str, count)) } :
Enumerable.Repeat(str, count).ToArray();
}
foreach(或者更好的是经典的for)总是比使用Linq快得多。 仅当 Linq 表达式使代码更具可读性时才应使用它
在 VB.NET 中
导入系统.Linq
Dim n As Integer = 10
Dim colorArray = New Color(n - 1) {}.[Select](Function(item) Color.White).ToArray()