使用一些元素计数初始化List <>

Ton*_*ony 14 c# list

让我说我有一个简单的List<bool>.我想初始化它并添加例如100个元素.为此,我可以这样做:

var myList = new List<bool>();

for (int i = 0; i < 100; i++)
{
    myList.Add(false);
}
Run Code Online (Sandbox Code Playgroud)

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

Ond*_*cek 36

使用Enumerable.Repeat

var myList = Enumerable.Repeat(false, 100).ToList();
Run Code Online (Sandbox Code Playgroud)

哪一个

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


Dar*_*rov 13

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

var myList = Enumerable.Range(1, 100).Select(x => false).ToList();
Run Code Online (Sandbox Code Playgroud)


Lua*_*aan 12

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

new List<bool>(new bool[100]);
Run Code Online (Sandbox Code Playgroud)


Kri*_*ten 5

List<T>没有具体的方法来做到这一点.循环是您的最佳选择.

但是,通过使用初始容量初始化列表,可以在运行时提高效率:

var myList = new List<bool>(100);
Run Code Online (Sandbox Code Playgroud)

使用此构造函数时,列表将在内部分配一个包含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);
    }
}
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它:

var myList = new List<bool>();
myList.Initialize(false, 100);
Run Code Online (Sandbox Code Playgroud)

您拥有的另一个选项是使用数组.

var myList = new bool[100];
Run Code Online (Sandbox Code Playgroud)

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