用一些元素初始化 List<>

21

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

var myList = new List<bool>();

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

但这不是最优雅的方法。是否有任何内置方法来简化它?我不想使用任何循环,只是出于好奇。


请不要在问题标题中包含有关所使用编程语言的信息,除非没有它就没有意义。标签可以起到这个作用。 - Ondrej Janacek
@TimSchmelter 我认为这有点过于苛刻了,因为该问题是关于在值A和B之间初始化多个不同整数值的。这只是一个简单的使用false/默认值初始化List<bool> - CodingIntrigue
我在思考最快的方法,尽管知道这是过早优化而不是实际问题,但我的思维卡住了。 - Jodrell
5个回答

48

使用Enumerable.Repeat

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

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


17

false很容易,因为它是布尔类型的默认值:

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

13

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

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

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

这个例子有趣的地方在于,你不需要初始化数组。由于 bool 的默认值为 false,因此数组中的所有元素都会自动拥有 false 值。如果你的列表不需要动态调整大小,那么这绝对是可以考虑的选项。


4

您可以使用 List.AddRange

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

如果 AddRange 是流畅的... - Jodrell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接