2012-11-06 13 views
12

Desidero inizializzare un elenco con un oggetto e un elenco di oggetti in quello specifico ordine. Attualmente, sto facendo:Inizializza elenco con un singolo oggetto e un altro elenco di oggetti

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

speravo di consolidare che in un'istruzione di inizializzazione (la sintassi è sbagliato ovviamente):

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

C'è un modo per fare questo in modo conciso?

+0

questo non ha nulla a che fare con LINQ (le collezioni generiche esistono da .NET 2.0), quindi l'ho re-taggato per te. – Adam

+0

Che problema hai con il tuo primo snippet di codice? Com'è in alcun modo insoddisfacente o problematico. Praticamente qualsiasi altra opzione sarà più complessa, prendere più codice, essere meno leggibile e molto probabilmente meno performante. Sono sicuro che ci sono più aspetti problematici del tuo progetto che potresti dedicare al tempo necessario. – Servy

+0

@Servy Non ho dichiarato che il mio frammento di codice era problematico. Ho chiesto se ci fosse un modo più conciso per inizializzare la lista. Non conosco tutte le opzioni disponibili, quindi perché ho fatto la domanda. Sono d'accordo che molti altri modi (i pochi che conosco) sono più complessi o meno leggibili. Grazie per il tuo contributo. –

risposta

17

Se l'ordine degli elementi non è importante, si può usare:

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

Questo funziona utilizzando il List<T> costruttore che accetta un IEnumerable<T>, quindi l'inizializzatore della raccolta per aggiungere gli altri elementi. Ad esempio, il seguente:

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

stamperà:

3 
4 
5 
2 

Si noti che l'ordine è diverso da quello originale, tuttavia, come il singolo elemento viene aggiunto scorso.

Se l'ordine è importante, tuttavia, io personalmente solo costruire la lista, mettendo nel vostro primo oggetto nella inizializzatore, e chiamando AddRange:

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

Questo rende l'intenzione molto chiara, ed evita la costruzione di articoli temporanei (che sarebbero richiesti usando il Concat di LINQ, ecc.).

+0

Penso che voglia 'object1' venire prima nella lista risultante, quindi questo non funzionerà. – Lee

+1

@Lee Sì - è per questo che l'ho taggato specificamente nella domanda. Aggiunta anche un'opzione con l'ordine che è importante. –

7

Credo che il meglio che puoi fare è:

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

+1 da parte mia - ma renditi conto che questo crea un po 'di "spazzatura" extra dal momento che stai creando un array che viene semplicemente gettato via. Non è un grosso problema, ma sembra un po 'un casino per evitare una chiamata al metodo;) –

+0

Pensi che questo sia più leggibile o in qualche modo più facile da capire rispetto allo snippet di codice con cui ha iniziato? Dico che questo è un passo indietro, non avanti. – Servy

+0

@Servy - La domanda ha chiesto un metodo più conciso, e questo è. – Lee

Problemi correlati