Как я могу создать массив моего класса с конструктором по умолчанию? - PullRequest
5 голосов
/ 12 июня 2010

Например

MYCLASS[] myclass = new MYCLASS[10];

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

Ответы [ 6 ]

6 голосов
/ 12 июня 2010

Если вы не хотите записывать цикл, вы можете использовать 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();
}
2 голосов
/ 08 июля 2014
var a = Enumerable.Repeat(new MYCLASS(), 10).ToArray();
2 голосов
/ 12 июня 2010

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

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.: class должен избегать использования с типами значений, так как с типами значений уже инициализируются таким образом;просто new MyValueType[200] будет лучше.

2 голосов
/ 12 июня 2010

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

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();
1 голос
/ 12 июня 2010

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

MYCLASS[] myclass = (new MYCLASS[10]).Select(x => new MYCLASS()).ToArray();
1 голос
/ 12 июня 2010

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

var a = (from x in Enumerable.Range(10) select new MyClass()).ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...