2014-03-13 35 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