Подтвердить что ты не робот

Инициализировать список <> с некоторым количеством элементов

скажем, у меня есть простой List<bool>. Я хочу инициализировать его и добавить к нему, например, 100 элементов. Для этого я могу сделать:

var myList = new List<bool>();

for (int i = 0; i < 100; i++)
{
    myList.Add(false);
}

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

4b9b3361

Ответ 1

Использование Enumerable.Repeat

var myList = Enumerable.Repeat(false, 100).ToList();

которые

Создает последовательность, содержащую одно повторное значение.

Ответ 2

Вы можете использовать LINQ и более конкретно Select и ToList методы расширения:

var myList = Enumerable.Range(1, 100).Select(x => false).ToList();

Ответ 3

false легко, так как это значение по умолчанию boolean:

new List<bool>(new bool[100]);

Ответ 4

List<T> не имеет специального метода для этого. Петля - ваш лучший вариант.

Однако вы можете сделать его более эффективным во время выполнения, инициализируя список с начальной емкостью:

var myList = new List<bool>(100);

При использовании этого конструктора список будет внутренне выделять массив из 100 элементов. Если вы используете конструктор по умолчанию, он начнет с первого 0 и затем 4 элемента. После добавления 4 элементов в списке будет выделен массив из 8 элементов и скопирован 4, которые уже были добавлены. Затем он вырастет до 16, 32, 64 и, наконец, 128. Все эти распределения и операции копирования можно избежать, используя конструктор с начальной емкостью.

В качестве альтернативы, если вам нужно сделать это в разных местах вашей программы, вы можете сделать метод расширения:

public static void Initialize<T>(this List<T> list, T value, int count)
{
    if (list == null)
    {
        throw new ArgumentNullException("list");
    }

    if (list.Count != 0)
    {
        throw new InvalidOperationException("list already initialized");
    }

    if (list.Capacity < count)
    { 
        list.Capacity = count;
    }

    for (int i = 0, i < count, i++)
    {
        list.Add(value);
    }
}

Вы бы использовали его следующим образом:

var myList = new List<bool>();
myList.Initialize(false, 100);

Другой вариант, который у вас есть, - использовать массив.

var myList = new bool[100];

Интересным в этом конкретном примере является то, что вам не нужно инициализировать массив. Поскольку false является значением по умолчанию для bool, все элементы в массиве будут автоматически иметь значение false. Если вам не нужно динамически изменять размер списка, это, безусловно, возможность рассмотреть.

Ответ 5

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

List<bool> list = new List<bool>();
list.AddRange(Enumerable.Repeat(default(bool), 100));