Создание списка, заполненного новыми экземплярами объекта
Какой лучший способ создать список с произвольным количеством экземпляров одного и того же объекта? то есть более компактный или эффективный способ сделать следующее?
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());
}
}
}