Создание списка, заполненного новыми экземплярами объекта

Какой лучший способ создать список с произвольным количеством экземпляров одного и того же объекта? то есть более компактный или эффективный способ сделать следующее?

static List<MyObj> MyObjs = Enumerable.Range(0, 100)
    .Select(i => new MyObj())
    .ToList();

(Enumerable.Repeat даст мне десять ссылок на один и тот же объект, поэтому я не думаю, что это сработает.)

Ответ 1

Это не сложно реализовать как итератор:

IEnumerable<T> CreateItems<T> (int count) where T : new() {
    return CreateItems(count, () => new T());
}

IEnumerable<T> CreateItems<T> (int count, Func<T> creator) {
    for (int i = 0; i < count; i++) {
        yield return creator();
    }
}

Ответ 2

Отредактировано, чтобы отразить, что этот метод не работает.

Мне было интересно узнать ваш комментарий о Enumerable.Repeat, поэтому я попробовал его.

//do not use!
List<object> myList = Enumerable.Repeat(new object(), 100).ToList();

Я подтвердил, что все они имеют ту же ссылку, что и упомянутый ОП.

Ответ 3

По-видимому, ответ "нет". Спасибо, всем!

Ответ 4

Не уверен, что в этом случае неправильный цикл for. По крайней мере, мы можем определить потенциал списка. Это может быть не важно для 100 объектов, но размер произвольный.

public class MyClass
{
    static int Capacity = 100;
    static List<MyObj> MyObjs = new List<MyObj>(Capacity);

    static MyClass() {
       for( var i = 0; i < Capacity; i++ ) {
          MyObjs.Add(new MyObj());
       }
    }
}