Fusiona dos (o más) listas en una, en C # .NET

¿Es posible convertir dos o más listas en una sola lista, en .NET usando C #?

Por ejemplo,

public static List GetAllProducts(int categoryId){ .... } . . . var productCollection1 = GetAllProducts(CategoryId1); var productCollection2 = GetAllProducts(CategoryId2); var productCollection3 = GetAllProducts(CategoryId3); 

Puede usar los Concat LINQ Concat y ToList :

 var allProducts = productCollection1.Concat(productCollection2) .Concat(productCollection3) .ToList(); 

Tenga en cuenta que hay formas más eficientes de hacerlo: lo anterior básicamente recorrerá todas las entradas, creando un búfer de tamaño dynamic. Como puede predecir el tamaño para empezar, no necesita este tamaño dynamic … por lo que podría usar:

 var allProducts = new List(productCollection1.Count + productCollection2.Count + productCollection3.Count); allProducts.AddRange(productCollection1); allProducts.AddRange(productCollection2); allProducts.AddRange(productCollection3); 

( AddRange tiene un AddRange especial para ICollection por eficiencia).

No tomaría este enfoque a menos que realmente tengas que hacerlo.

Suponiendo que desea una lista que contenga todos los productos para los Id. De categoría especificados, puede tratar su consulta como una proyección seguida de una operación de aplanamiento . Hay un operador LINQ que hace eso: SelectMany .

 // implicitly List var products = new[] { CategoryId1, CategoryId2, CategoryId3 } .SelectMany(id => GetAllProducts(id)) .ToList(); 

En C # 4, puede acortar el SelectMany a: .SelectMany(GetAllProducts)

Si ya tiene listas que representan los productos para cada Id, entonces lo que necesita es una concatenación , como otros señalan.

puedes combinarlos usando LINQ:

  list = list1.Concat(list2).Concat(list3).ToList(); 

el enfoque más tradicional de usar List.AddRange() podría ser más eficiente.

Puede usar el método de extensión Concat :

 var result = productCollection1 .Concat(productCollection2) .Concat(productCollection3) .ToList(); 
 list4 = list1.Concat(list2).Concat(list3).ToList(); 

Eche un vistazo a List.AddRange para fusionar listas

Ya lo comenté, pero sigo pensando que es una opción válida, solo prueba si en tu entorno es mejor una solución u otra. En mi caso particular, el uso de source.ForEach(p => dest.Add(p)) funciona mejor que el AddRange clásico, pero no he investigado por qué en el nivel bajo.

Puede ver un código de ejemplo aquí: https://gist.github.com/mcliment/4690433

Entonces la opción sería:

 var allProducts = new List(productCollection1.Count + productCollection2.Count + productCollection3.Count); productCollection1.ForEach(p => allProducts.Add(p)); productCollection2.ForEach(p => allProducts.Add(p)); productCollection3.ForEach(p => allProducts.Add(p)); 

Pruébelo para ver si funciona para usted.

Descargo de responsabilidad : no estoy abogando por esta solución, creo que Concat la más clara. Acabo de decir -en mi conversación con Jon- que en mi máquina este caso funciona mejor que AddRange , pero él dice, con mucho más conocimiento que yo, que esto no tiene sentido. Ahí está la esencia si quieres comparar.

Debe usar la operación Concat

En el caso especial: “Todos los elementos de List1 van a una nueva Lista2”: (por ejemplo, una lista de cadenas)

 List list2 = new List(list1); 

En este caso, list2 se genera con todos los elementos de list1.

 // I would make it a little bit more simple var products = new List> {item1, item2, item3 }.SelectMany(id => id).ToList(); 

De esta forma, es una lista multidimensional y .SelectMany () la aplanará en un IEnumerable de producto y luego utilizaré el método .ToList ().

Cuando tienes pocas listas pero no sabes cuántas exactamente, usa esto:

listsOfProducts contiene pocas listas llenas de objetos.

 List productListMerged = new List(); listsOfProducts.ForEach(q => q.ForEach(e => productListMerged.Add(e))); 

Sé que esta es una vieja pregunta. Pensé que podría agregar solo 2 centavos.

Si tiene una List[] , puede unirse a ellos usando Aggregate

 public List Concat(params List[] lists) { var result = lists.Aggregate(new List(), (x, y) => x.Concat(y).ToList()); return result; } 

Espero que esto ayude.