Например,
MYCLASS[] myclass = new MYCLASS[10];
Теперь массив myclass является всем пустым массивом, но я хочу иметь созданный Массив значения по умолчанию.I, знают, что я могу записать циклы для созданного значения по умолчанию набора, но я ищу более легкий и простой путь.
Нет более легкого пути. Если вам просто не нравятся циклы, вы можете использовать
MyClass[] array = new[] { new MyClass(), new MyClass(), new MyClass(), new MyClass() };
, который даст вам массив с 4 элементами типа MyClass, построенный с помощью конструктора по умолчанию.
В противном случае у вас просто есть возможность использовать цикл.
Если вы не хотите писать этот цикл каждый раз, когда хотите построить свой массив, вы можете создать вспомогательный метод, например, как метод расширения:
static class Extension
{
public static void ConstructArray<T>(this T[] objArray) where T : new()
{
for (int i = 0; i < objArray.Length; i++)
objArray[i] = new T();
}
}
А затем использовать его следующим образом:
MyClass[] array = new MyClass[10];
array.ConstructArray();
Вы можете использовать LINQ.
var a = (from x in Enumerable.Range(10) select new MyClass()).ToArray();
Если вы не хотите записывать цикл, вы можете использовать вместо него Enumerable.Range
:
MyClass[] a = Enumerable.Range(0, 10)
.Select(x => new MyClass())
.ToArray();
Примечание: он значительно медленнее, чем метод, который вы упомянули, используя цикл, записанный здесь для ясности:
MyClass[] a = new MyClass[10];
for (int i = 0; i < a.Length; ++i)
{
a[i] = new MyClass();
}
Если мы хотим выполнять всю работу только в одной строке, так что это лучше всего
MYCLASS[] myclass = (new MYCLASS[10]).Select(x => new MYCLASS()).ToArray();
На самом деле лучшего способа нет. Вы можете сделать что-то вроде:
public static T[] CreateArray<T>(int len) where T : class, new() {
T[] arr = new T[len];
for(int i = 0 ; i <arr.Length ; i++) { arr[i] = new T(); }
return arr;
}
тогда, по крайней мере, вам понадобится только:
Foo[] data = CreateArray<Foo>(150);
Этот подход, по крайней мере, позволит избежать перераспределения, и может использовать оптимизацию массива/длины JIT. Класс :
следует избегать использовать с типами значений, поскольку типы значений уже инициализируются таким образом; просто new MyValueType[200]
было бы лучше.