Список 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.

Нет! Укажите начальную емкость.

Статья MSDN:

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

Поскольку вы не можете сделать это напрямую со списком, вы можете использовать вспомогательный метод для создания генератора и использования перегрузки 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 символов.

Другие вопросы по тегам