2012-11-06 7 views
12

Ich möchte eine Liste mit einem Objekt und einer Liste von Objekten in dieser bestimmten Reihenfolge initialisieren. Derzeit ich tue:Initialisiere Liste mit einem einzelnen Objekt und einer anderen Liste von Objekten

List<MyObject> list = new List<MyObject>(); 
list.Add(object1); // object1 is type MyObject 
list.AddRange(listOfObjects); // listOfObjects is type List<MyObject> 

Ich hatte gehofft, dass in einer Initialisierung Anweisung zu konsolidieren (die Syntax ist natürlich falsch):

List<MyObject> newList = new List<MyObject>() { object1, listOfObjects }; 

Gibt es eine Möglichkeit, dies prägnant zu tun?

+0

Dies hat nichts mit LINQ zu tun (die generischen Sammlungen existieren seit .NET 2.0), also habe ich es für Sie neu getaggt. – Adam

+0

Welches Problem haben Sie mit Ihrem ersten Code-Snippet? Wie ist es in irgendeiner Weise unbefriedigend oder problematisch? Praktisch jede andere Option wird komplexer sein, mehr Code benötigen, weniger lesbar sein und sehr wahrscheinlich weniger leistungsfähig sein. Ich bin mir sicher, dass es problematischere Aspekte Ihres Projekts gibt, an denen Sie Zeit verbringen könnten. – Servy

+0

@Servy Ich habe nicht festgestellt, dass mein Code-Fragment problematisch war. Ich fragte, ob es eine prägnantere Möglichkeit gebe, die Liste zu initialisieren. Ich kenne nicht alle Optionen, die es gibt, weshalb ich die Frage gestellt habe. Ich stimme zu, dass die meisten anderen Wege (die wenigen, die ich kenne) komplexer oder weniger lesbar sind. Danke für deinen Beitrag. –

Antwort

17

Wenn die Reihenfolge der Elemente nicht wichtig ist, können Sie:

List<MyObject> newList = new List<MyObject>(listOfObjects) { object1 }; 

Dies funktioniert durch die List<T> Konstruktor, die akzeptiert eine IEnumerable<T>, dann die Sammlung Initialisierer, um die anderen Elemente hinzuzufügen. die folgende Beispiel::

static void Main() 
{ 
    int test = 2; 
    List<int> test2 = new List<int>() { 3, 4, 5 }; 
    List<int> test3 = new List<int>(test2) { test }; 

    foreach (var t in test3) Console.WriteLine(t); 

    Console.ReadKey(); 
} 

drucken:

3 
4 
5 
2 

Beachten Sie, dass der Auftrag als Ihre ursprünglichen anders ist, aber, wie das einzelne Element hinzugefügt wird letzte.

Wenn die Reihenfolge wichtig ist, aber ich persönlich würde nur die Liste erstellen, in dem Initialisierer in Ihrem ersten Objekt platzieren und rief AddRange:

List<MyObject> newList = new List<MyObject> { object1 }; 
newList.AddRange(listOfObjects); 

Dies ist die Absicht, sehr deutlich macht, und vermeiden Bau von temporären Elementen (die unter Verwendung von LINQ's Concat usw. benötigt werden).

+0

Ich denke, er will, dass "object1" in der resultierenden Liste zuerst steht, also wird das nicht funktionieren. – Lee

+1

@Lee Yeah - deshalb habe ich das speziell in der Frage markiert. Es wurde auch eine Option hinzugefügt, wobei die Reihenfolge wichtig ist. –

7

Ich denke, das Beste, was Sie tun können, ist:

List<MyObject> newList = new[] { object1 }.Concat(listOfObjects).ToList(); 
+1

+1 von mir - aber realisieren, dass dies einige zusätzliche "Müll" erstellt, da Sie ein Array, das gerade weggeworfen wird machen. Keine große Sache, aber scheint ein wenig Chaos zu sein, um einen Methodenaufruf zu vermeiden;) –

+0

Glaubst du, dass dies lesbarer oder in irgendeiner Weise einfacher zu verstehen ist als das Code-Snippet, mit dem er angefangen hat? Ich sage das ist ein Schritt zurück, nicht vorwärts. – Servy

+0

@Servy - Die Frage nach einer präziseren Methode gefragt, und das ist. – Lee

Verwandte Themen