2010-03-01 8 views
5

Ho per esempio 5 Elencare tutti dello stesso tipo. Posso semplicemente fareLista <T> Concatenazione per quantità "X" di elenchi

List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4)..... 
+0

Quasi uguale: [elegante-strada-combinare-più-collezioni-di-elementi] (http://stackoverflow.com/questions/4493858/elegant-way-to-combine-multiple-collections-of -elementi) – nawfal

risposta

4

è possibile, ma non dimenticate di aggiungere .ToList(); alla fine. anche è possibile chiamare newset.AddRange(ListX); penso che sia meglio in termini di prestazioni

5

Sì, puoi farlo.

List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList(); 
1

È certamente possibile farlo, anche se potrebbe non essere incredibilmente efficiente.

Come già detto da altre risposte, non dimenticate di aggiungere .ToList() alla fine della vostra linea di codice oppure usa List1.AddRange(List2); List1.AddRange(List3); ... per l'efficienza aggiunta.

13

È possibile effettuare questa operazione (anche se è necessario .ToList() alla fine).

Tuttavia, sarebbe (leggermente) più efficiente generare un singolo elenco e utilizzare AddRange da aggiungere in ogni elenco. Basta inizializzare la lista con la dimensione totale di tutti i tuoi elenchi, quindi chiama AddRange ripetutamente.

Si potrebbe prendere in considerazione di fare qualcosa di simile:

public List<T> ConcatMultiple<T>(this List<T> list, params[] ICollection<T> others) 
{ 
    List<T> results = new List<T>(list.Count + others.Sum(i => i.Count)); 
    results.AddRange(list); 
    foreach(var l in others) 
     results.AddRange(l); 
    return results; 
} 

quindi chiamando via:

List<MyClass> newset = List1.ConcatMultiple(List2, List3, List4); 
+1

Sembra un po 'strano fare un metodo di estensione di un elenco specifico, considerando che restituisce un elenco completamente nuovo e non ha alcun effetto sull'elenco principale in alcun modo. –

+1

@Ilia: Non mi sembra strano, poiché in realtà non è diverso da Enumerable.Concat in termini di utilizzo: http://msdn.microsoft.com/en-us/library/bb302894.aspx –

1

per il conte elenco di variabili:

IEnumerable<T> enumerable = Enumerable.Empty<T>(); 
foreach (List<T> list in [whatever]) 
    enumerable = enumerable.Concat(list); 

Alla fine si potrebbe aggiungere un "ToList()" se si desidera un elenco contare:

List<T> list = enumerable.ToList(); 

Tuttavia, questo potrebbe non essere necessario.

1

di voi può utilizzare un sindacato in LINQ se si tratta di una vera e propria unione che si vuole fare naturalmente ...

2

Se si desidera concatenare un numero (precedentemente sconosciuta) arbitraria delle liste, quindi potrebbe essere necessario concatenare una raccolta di elenchi. Probabilmente il modo più semplice per farlo sarebbe quello di utilizzare il SelectMany dell'operatore (o nidificati from clausole nella query LINQ):

IEnumerable<List<int>> lists = /* get list of lists */; 
List<int> result = lists.SelectMany(e => e).ToList(); 

L'operatore SelectMany chiama la funzione specificata per ogni elemento della lista di input (che è una lista) e quindi concatena tutti gli elenchi risultanti (gli elenchi effettivi dall'elenco di input degli elenchi). In alternativa utilizzando la sintassi di query LINQ:

List<int> result = (from l in lists 
        from e in l select e).ToList(); 

credo che il compilatore C# può effettivamente ottimizzare questo, in modo che esso non iterare su tutti i singoli elementi (e fa la stessa cosa come la versione esplicita sopra). Se si dispone di un numero noto di liste, si può ovviamente scrivere:

List<int> result = (from l in new[] { list1, list2, list3, list4 } 
        from e in l select e).ToList(); 

Non è elegante come la definizione di un proprio metodo esattamente per questo scopo, ma dimostra quanto sia potente la sintassi di query LINQ è.

Problemi correlati