开发者

Initializing a C# array with multiple copies of the same element

开发者 https://www.devze.com 2023-04-02 06:45 出处:网络
In the C++ Standard Template Library (STL), it is possible for example to create a ve开发者_开发技巧ctor consisting of multiple copies of the same element, using this constructor:

In the C++ Standard Template Library (STL), it is possible for example to create a ve开发者_开发技巧ctor consisting of multiple copies of the same element, using this constructor:

std::vector<double> v(10, 2.0);

This would create a vector of 10 doubles, initially set to 2.0.

I want to do a similar thing in C#, more specifically creating an array of n doubles with all elements initialized to the same value x.

I have come up with the following one-liner, relying on generic collections and LINQ:

double[] v = new double[n].Select(item => x).ToArray();

However, if an outsider would read this code I don't think it would be immediately apparent what the code actually does. I am also concerned about the performance, I suppose it would be faster to initialize the array elements via a for loop (although I haven't checked). Does anybody know of a cleaner and/or more efficient way to perform this task?


What about this?

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

EDIT: I just did a small benchmark; to create 1000 arrays of 100000 elements each, using a loop is about 3 times faster that Enumerable.Repeat.

Repeat 
00:00:18.6875488 

Loop 
00:00:06.1628806 

So if performance is critical, you should prefer the loop.


var arr = Enumerable.Repeat(x, n).ToArray();

Personally, I'd just use a regular array loop, though:

var arr = new double[n];
for(int i = 0 ; i < arr.Length ; i++) arr[i] = x;

More characters, but the array is demonstrably the right size from the outset - no iterative growth List<T>-style and final copy back. Also; simply more direct - and the JIT can do a lot to optimise the for(int i = 0 ; i < arr.Length ; i++) pattern (for arrays).


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


Later versions of .NET have introduced an Array.Fill method. See usage:

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


the for each (or better the classic for) is always much faster than using Linq. You should use the Linq expression only if it makes the code more readable


In VB.NET

Imports System.Linq

Dim n As Integer = 10

Dim colorArray = New Color(n - 1) {}.[Select](Function(item) Color.White).ToArray()
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号