2014-03-13 14 views
12

Lassen Sie uns sagen, ich habe eine einfache List<bool>. Ich möchte es initialisieren und z. B. 100 Elemente hinzufügen. Um dies zu tun, kann ich tun:Initialize List <> mit einigen Elementen

var myList = new List<bool>(); 

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

aber es ist nicht der eleganteste Ansatz. Gibt es eine eingebaute Methode, um es zu vereinfachen? Ich will keine Schleifen, nur für Neugier

+0

Bitte, enthalten keine Informationen über eine Sprache in einer Frage-Titel, wenn es verwendet würde ohne sie keinen Sinn ergeben. Tags dienen diesem Zweck. –

+0

@TimSchmelter Ich denke, das ist ein * bisschen * harsch, da diese Frage die Initialisierung mehrerer verschiedener ganzzahliger Werte zwischen den Werten A und B verlangt. Dies ist nur eine einfache Initialisierung einer 'Liste ' mit falschen/Standardwerten. – CodingIntrigue

+0

Ich bin mental darauf fest, was der schnellste Weg ist, dies zu tun, obwohl ich seine vorschnelle Optimierung kenne und nicht die eigentliche Frage. – Jodrell

Antwort

31

Mit Enumerable.Repeat

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

die

Erzeugt eine Sequenz, die einen wiederholten Wert enthält.

13

Sie LINQ verwenden könnte und insbesondere die Select und ToList Erweiterungsmethoden:

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

List<T> hat keine spezifische Methode, dies zu tun. Die Schleife ist die beste Option.

Sie können aber es effizienter, zur Laufzeit machen, indem er die Liste mit einer Anfangskapazität der Initialisierung:

var myList = new List<bool>(100); 

Wenn Sie diesen Konstruktor verwenden, wird die Liste intern ein Array von 100 Elementen zuordnen. Wenn Sie den Standardkonstruktor verwenden, beginnt er mit der ersten 0 und dann mit 4 Elementen. Nachdem 4 Elemente hinzugefügt wurden, weist die Liste ein Array mit 8 Elementen zu und kopiert die 4 Elemente, die bereits hinzugefügt wurden. Dann wird es auf 16, 32, 64 und schließlich auf 128 wachsen. All diese Zuweisungen und Kopieroperationen können vermieden werden, indem der Konstruktor mit der Anfangskapazität verwendet wird.

Alternativ, wenn Sie dies in Ihrem Programm an verschiedenen Orten tun müssen, könnten Sie eine Erweiterungsmethode machen:

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); 
    } 
} 

Sie würde es so verwenden:

var myList = new List<bool>(); 
myList.Initialize(false, 100); 

Die andere Option Sie müssen ein Array verwenden.

Das interessante an diesem speziellen Beispiel ist, dass Sie das Array nicht initialisieren müssen. Da false der Standardwert für bool ist, haben alle Elemente im Array automatisch den Wert false. Wenn Ihre Liste nicht dynamisch angepasst werden muss, ist dies eine Option, die Sie berücksichtigen sollten.

+0

Warum der Downvote? Dies spart eine Menge von Zuweisungen. Standardmäßig wird die Liste verdoppelt, wenn die Kapazität nicht ausreicht. Dadurch werden unnötige Speicherkopien und -zuweisungen vermieden. – Luaan

+1

@Luaan Was downvote? –

+1

Sie hatten einmal einen Down-Vote. Es scheint, als ob die Person es seit :) zurückgezogen hat – Luaan

9

false ist einfach, da es der Standardwert von boolean ist:

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

können Sie verwenden List.AddRange:

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

und wenn 'AddRange' fließend war ... – Jodrell

Verwandte Themen