2014-03-13 31 views
12

比方说,我有一个简单的List<bool>。我想初始化它并添加例如100个元素。为此,我可以这样做:初始化列表<>与一些元素数

var myList = new List<bool>(); 

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

但它并不是最优雅的方法。有没有内置的方法来简化它?我不希望任何循环,只是出于好奇

+0

请,不包括有关在问题的标题,除非它使用的语言信息没有它就没有意义。标签用于此目的。 –

+0

@TimSchmelter我觉得这个问题很棘手,因为这个问题是关于在A和B之间初始化多个不同的整数值。这只是一个简单的初始化'List ',其中包含假/默认值。 – CodingIntrigue

+0

尽管知道它过早的优化而不是实际的问题,但我仍然陷入了精神上停滞不前的最快方式。 – Jodrell

回答

31

使用Enumerable.Repeat

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

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

13

你可以使用LINQ和更具体的SelectToList扩展方法:

var myList = Enumerable.Range(1, 100).Select(x => false).ToList(); 
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]; 

这个特定的例子有趣的是你不必初始化数组。由于falsebool的默认值,数组中的所有元素将自动具有值false。如果您的列表不需要动态调整大小,这当然是一个可以考虑的选项。

+0

为什么downvote?这节省了大量的分配。默认情况下,容量不足时可以加倍列表,这样可以避免大量不必要的内存复制和分配。 – Luaan

+1

@Luaan什么downvote? –

+1

你曾经有过一次投票。似乎这个人收回它,因为:) – Luaan

9

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

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

您可以使用List.AddRange

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

,如果'AddRange'流利...... – Jodrell