Список C#<GenericClass>(100) Принципы построения
Если я сделаю следующее:
List<GenericClass> listObj = new List<GenericClass>(100);
// Do I need this part too?
for (int i = 0; i < 100; i++)
{
listObj[i] = new GenericClass();
}
По сути, я спрашиваю, будет ли компилятор C# автоматически запускать конструктор GenericClass для каждого из 100 объектов GenericClass в списке. Я искал в документации MSDN, а также здесь, на Stackru.
Спасибо за любую помощь.
4 ответа
Это не так List
работает. Когда вы указываете емкость, это начальная емкость, а не количество элементов в списке. Список не содержит элементов, пока вы не добавите их через Add
метод. Списки не имеют максимальной емкости. И так как вы добавляете объекты с помощью метода Add, да, вам придется сначала их добавить.
На самом деле, то, что вы задали в своем вопросе, ArgumentOutOfRange
исключение.
Для того, что вы делаете, вам нужно использовать массив.
var listObj = new List<GenericClass>();
listObj[0] = new GenericClass(); // ArgumentOutOfRange exception
Это будет работать:
for (int i=0;i<100;i++)
{
listObj.Add(new GenericClass());
}
Это то, что вы пытались сделать:
var arrayObj = new GenericClass[100];
for (int i = 0; i < 100; i++)
{
arrayObj[i] = new GenericClass();
}
Да, вам нужно создать и добавить каждый экземпляр в список. Посмотрите на раздел замечаний для этого стиля конструктора: http://msdn.microsoft.com/en-us/library/dw8e0z9z.aspx
Вы указываете, сколько элементов вы ожидаете поместить в список, чтобы не приходилось изменять размер списка за кулисами каждый раз, когда вы добавляете в него новый экземпляр GenericClass.
Нет! Укажите начальную емкость.
Емкость списка - это количество элементов, которое может содержать список. Когда элементы добавляются в список, емкость автоматически увеличивается по мере необходимости путем перераспределения внутреннего массива.
Поскольку вы не можете сделать это напрямую со списком, вы можете использовать вспомогательный метод для создания генератора и использования перегрузки List(IEnumerable collection).
class Program
{
static void Main(string[] args)
{
var list = new List<string>
(
Generator.New(() => new string('a', 5), 100)
);
list.ForEach((x) => Console.WriteLine(x));
}
}
public static class Generator
{
public static IEnumerable<T> New<T>(Func<T> generator, int nCount)
{
for (int i = 0; i < nCount; i++)
{
yield return generator();
}
}
public static IEnumerable<T> New<T>(Func<int,T> generator, int nCount)
{
for (int i = 0; i < nCount; i++)
{
yield return generator(i);
}
}
}
Это работает, но не так красиво, как могло бы быть, если бы List поддерживал эту функциональность из коробки. Программа-пример напечатает 100 строк, состоящих из 5 символов.