Как я могу создать массив своего класса с конструктором по умолчанию?

Например,

MYCLASS[] myclass = new MYCLASS[10];

Теперь массив myclass является всем пустым массивом, но я хочу иметь созданный Массив значения по умолчанию.I, знают, что я могу записать циклы для созданного значения по умолчанию набора, но я ищу более легкий и простой путь.

5
задан Freshblood 12 June 2010 в 09:40
поделиться

5 ответов

Нет более легкого пути. Если вам просто не нравятся циклы, вы можете использовать

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();
2
ответ дан 18 December 2019 в 13:11
поделиться

Вы можете использовать LINQ.

var a = (from x in Enumerable.Range(10) select new MyClass()).ToArray();
1
ответ дан 18 December 2019 в 13:11
поделиться

Если вы не хотите записывать цикл, вы можете использовать вместо него 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();
}
6
ответ дан 18 December 2019 в 13:11
поделиться

Если мы хотим выполнять всю работу только в одной строке, так что это лучше всего

MYCLASS[] myclass = (new MYCLASS[10]).Select(x => new MYCLASS()).ToArray();
1
ответ дан 18 December 2019 в 13:11
поделиться

На самом деле лучшего способа нет. Вы можете сделать что-то вроде:

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] было бы лучше.

2
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: