2010-03-01 11 views
5

Tengo por ejemplo 5 Enumerar todo del mismo tipo. ¿Puedo simplemente hacerLista <T> Concatenación para 'X' cantidad de listas

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

Casi lo mismo: [elegant-way-to-combine-multiple-collections-of-elements] (http://stackoverflow.com/questions/4493858/elegant-way-to-combine-multiple-collections-of -elementos) – nawfal

Respuesta

4

se puede, pero no se olvide de añadir .ToList(); al final. También puede llamar newset.AddRange(ListX); creo que es mejor en términos de rendimiento

5

Sí, puedes hacer eso.

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

Sin duda puede hacerlo, aunque puede que no sea increíblemente eficiente.

Según lo declarado por otras respuestas, no olvide agregar .ToList() al final de su línea de código, o use List1.AddRange(List2); List1.AddRange(List3); ... para mayor eficiencia.

13

Puede hacer esto (aunque necesita .ToList() al final).

Sin embargo, sería (un poco) más eficiente generar una lista única, y usar AddRange para agregar en cada lista. Simplemente inicialice la lista con el tamaño total de todas sus listas, luego llame AddRange repetidamente.

Es posible que desee considerar hacer algo como:

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

Entonces llamando a través de:

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

Parece un poco extraño hacer de eso un método de extensión de una lista específica, considerando que devuelve una lista completamente nueva y no afecta la lista principal de ninguna manera. –

+1

@Ilia: No me parece extraño, ya que en realidad no es diferente de Enumerable.Concat en términos de uso: http://msdn.microsoft.com/en-us/library/bb302894.aspx –

1

Para variable de recuento lista:

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

Al final se puede añadir una "ToList()" si desea una lista de confiar:

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

Sin embargo, esto podría no ser necesario.

1

de que puede utilizar una unión en LINQ si se trata de una verdadera unión que usted quiere hacer por supuesto ...

2

Si desea concatenar un número arbitrario (hasta ahora desconocido) de las listas, entonces puede que tenga para concatenar una colección de listas. Probablemente la forma más sencilla de hacerlo sería utilizar el operador SelectMany (o anidados from cláusulas de consulta LINQ):

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

El operador SelectMany llama a la función dada para cada elemento de la lista de entrada (que es una lista) y luego concatena todas las listas resultantes (las listas reales de su lista de listas de entrada). Como alternativa utilizando la sintaxis de la consulta LINQ:

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

creo que el compilador de C# en realidad puede optimizar este, por lo que no iterar sobre todos los elementos individuales (y hace lo mismo que la versión explícita arriba). Si usted tiene un número conocido de listas, por supuesto puede escribir:

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

No es tan elegante como la definición de su propio método exactamente para este propósito, pero demuestra lo poderosa que la sintaxis de las consultas LINQ es.