Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

arrays

c#

linq

In the C++ Standard Template Library (STL), it is possible for example to create a vector 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?

like image 607
Anders Gustafsson Avatar asked Sep 05 '11 13:09

Anders Gustafsson


People also ask

What is initializing in C?

Initialization is the process of locating and using the defined values for variable data that is used by a computer program. For example, an operating system or application program is installed with default or user-specified values that determine certain aspects of how the system or program is to function.

What is initialization in C with example?

Initialization of Variablevariable_name=constant/literal/expression; Example: int a=10; int a=b+c; a=10; a=b+c; Multiple variables can be initialized in a single statement by single value, for example, a=b=c=d=e=10; NOTE: C variables must be declared before they are used in the c program.

Why do we initialize variables in C?

Initializing a variable, even if it is not strictly required, is ALWAYS a good practice. The few extra characters (like " = 0 ") typed during development may save hours of debugging time later, particularly when it is forgotten that some variables remained uninitialized.

What's the meaning of initialization?

: to set (something, such as a computer program counter) to a starting position, value, or configuration.


2 Answers

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.

like image 70
Thomas Levesque Avatar answered Sep 22 '22 23:09

Thomas Levesque


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).

like image 25
Marc Gravell Avatar answered Sep 19 '22 23:09

Marc Gravell