You can't, basically. When you create an array, it's always initially populated with the default value for the type - which for a class is always a null reference. For int
it's 0, for bool
it's false, etc.
(If you use an array initializer, that will create the "empty" array and then populate it with the values you've specified, of course.)
There are various ways of populating the array by calling the constructor - I would probably just use a foreach loop myself. Using LINQ with Enumerable.Range/Repeat feels a little forced.
Of course, you could always write your own population method, even as an extension method:
public static T[] Populate<T>(this T[] array, Func<T> provider)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = provider();
}
return array;
}
Then you could use:
Sample[] samples = new Sample[100].Populate(() => new Sample());
What I like about this solution:
- It's still a single expression, which can be useful in various scenarios
- It doesn't introduce concepts you don't actually want (like repeating a single value or creating a range)
Of course you could add more options:
- An overload which takes a
Func<int, T>
instead of a Func<T>
, passing the index to the provider
- A non-extension method which creates the array and populates it
id = Interlocked.Increment(ref count)
instead, and start withstatic int count = 1
(sinceInterlocked.Increment
returns the old value). – Antilebanonid
as if that is the point of the question. So I replacedid
withabc
. – Harbison