Вы не можете, в основном. Когда вы создаете массив, он всегда изначально заполняется значением по умолчанию для типа, которое для класса всегда является пустой ссылкой. Для int
это 0, для bool
это ложь и т. Д.
(Если вы используете инициализатор массива, который создаст «пустой» массив и , то заполнит его, конечно, указанными вами значениями.)
Существуют различные способы заполнения массива путем вызова конструктора - я бы , вероятно, просто использовал бы цикл foreach самостоятельно. Использование LINQ с Enumerable.Range / Repeat выглядит немного вынужденным.
Конечно, вы всегда можете написать свой собственный метод заполнения, даже в качестве метода расширения:
public static T[] Populate<T>(this T[] array, Func<T> provider)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = provider();
}
return array;
}
Тогда вы можете использовать:
Sample[] samples = new Sample[100].Populate(() => new Sample());
Что мне нравится в этом решении:
- Это все еще одно выражение, которое может быть полезно в различных сценариях
- Он не вводит понятия, которые вам на самом деле не нужны (например, повторение одного значения или создание диапазона)
Конечно, вы можете добавить больше опций:
- Перегрузка, которая принимает
Func<int, T>
вместо Func<T>
, передавая индекс поставщику
- Метод без расширения, который создает массив и заполняет его