Ответ 1
Использование Enumerable.Repeat
var myList = Enumerable.Repeat(false, 100).ToList();
которые
Создает последовательность, содержащую одно повторное значение.
скажем, у меня есть простой List<bool>
. Я хочу инициализировать его и добавить к нему, например, 100 элементов. Для этого я могу сделать:
var myList = new List<bool>();
for (int i = 0; i < 100; i++)
{
myList.Add(false);
}
но это не самый изящный подход. Есть ли встроенный метод для его упрощения? Я не хочу никаких циклов, просто для любопытства
Использование Enumerable.Repeat
var myList = Enumerable.Repeat(false, 100).ToList();
которые
Создает последовательность, содержащую одно повторное значение.
Вы можете использовать LINQ и более конкретно Select
и ToList
методы расширения:
var myList = Enumerable.Range(1, 100).Select(x => false).ToList();
false
легко, так как это значение по умолчанию boolean:
new List<bool>(new bool[100]);
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
. Если вам не нужно динамически изменять размер списка, это, безусловно, возможность рассмотреть.
Вы можете использовать List.AddRange:
List<bool> list = new List<bool>();
list.AddRange(Enumerable.Repeat(default(bool), 100));