初始化列表<>有一些元素

时间:2014-03-13 08:22:43

标签: c# list

假设我有一个简单的List<bool>。我想初始化它并添加100个元素。为此,我可以这样做:

var myList = new List<bool>();

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

但这不是最优雅的方法。有没有内置的方法来简化它?我不想要任何循环,仅仅是为了好奇

5 个答案:

答案 0 :(得分:36)

使用Enumerable.Repeat

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

其中

  

生成包含一个重复值的序列。

答案 1 :(得分:13)

您可以使用LINQ,更具体地说是SelectToList扩展方法:

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

答案 2 :(得分:12)

false很简单,因为它是boolean的默认值:

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

答案 3 :(得分:5)

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];

这个具体示例的有趣之处在于您不必初始化数组。由于falsebool的默认值,因此数组中的所有元素都将自动具有值false。如果您的列表不需要动态调整大小,那么这当然是一个需要考虑的选项。

答案 4 :(得分:3)

您可以使用List.AddRange

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