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

问题描述 投票:0回答:7

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

c# arrays linq
7个回答
49
投票

这个怎么样?

double[] v = Enumerable.Repeat(x, n).ToArray();

编辑:我刚刚做了一个小基准测试;要创建 1000 个数组,每个数组包含 100000 个元素,使用循环大约比

Enumerable.Repeat
快 3 倍。

Repeat 
00:00:18.6875488 

Loop 
00:00:06.1628806 

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


9
投票
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++)
模式(对于数组)。


3
投票

.NET 的更高版本引入了

Array.Fill
方法。查看用法:

double[] v = new double[n];
Array.Fill(v, 2.0);

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

0
投票

合并为一个扩展

    /// <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();
}

-1
投票

foreach(或者更好的是经典的for)总是比使用Linq快得多。 仅当 Linq 表达式使代码更具可读性时才应使用它


-2
投票

在 VB.NET 中

导入系统.Linq

Dim n As Integer = 10

Dim colorArray = New Color(n - 1) {}.[Select](Function(item) Color.White).ToArray()
© www.soinside.com 2019 - 2024. All rights reserved.