Mesclar duas (ou mais) listas em uma, em C # .NET

É possível converter duas ou mais listas em uma única lista, no .net usando c #?

Por exemplo,

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

Você pode usar os methods LINQ Concat e ToList :

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

Note que existem maneiras mais eficientes de fazer isso – o que foi mencionado acima irá basicamente percorrer todas as inputs, criando um buffer de tamanho dynamic. Como você pode prever o tamanho para começar, você não precisa deste dimensionamento dynamic … então você pode usar:

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

( AddRange é especial para ICollection para eficiência.)

Eu não tomaria essa abordagem a menos que você realmente precise.

Supondo que você queira uma lista contendo todos os produtos para os IDs de categoria especificados, você pode tratar sua consulta como uma projeção, seguida por uma operação de nivelamento . Existe um operador LINQ que faz isso: SelectMany .

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

No C # 4, você pode encurtar o SelectMany para: .SelectMany(GetAllProducts)

Se você já tem listas representando os produtos para cada Id, então o que você precisa é de uma concatenação , como outros apontam.

você pode combiná-los usando o LINQ:

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

a abordagem mais tradicional de usar List.AddRange() pode ser mais eficiente.

Você poderia usar o método de extensão Concat :

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

Dê uma olhada no List.AddRange para mesclar listas

Eu já comentei, mas ainda acho que é uma opção válida, apenas teste se no seu ambiente é melhor uma solução ou outra. No meu caso particular, usando source.ForEach(p => dest.Add(p)) funciona melhor do que o AddRange clássico, mas eu não investiguei porque no nível baixo.

Você pode ver um código de exemplo aqui: https://gist.github.com/mcliment/4690433

Então a opção seria:

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

Teste para ver se funciona para você.

Isenção de responsabilidade : não estou defendendo essa solução, acho a Concat a mais clara. Acabei de declarar – na minha discussão com Jon – que na minha máquina esse caso tem melhor desempenho que o AddRange , mas ele diz que, com muito mais conhecimento do que eu, isso não faz sentido. Há a essência, se você quiser comparar.

Você precisa usar a operação Concat

No caso especial: “Todos os elementos de List1 vão para uma nova List2”: (por exemplo, uma lista de strings)

 List list2 = new List(list1); 

Nesse caso, list2 é gerado com todos os elementos de list1.

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

Desta forma, é uma lista multi dimensional e o .SelectMany () irá achatá-lo em um IEnumerable de produto, então eu uso o método .ToList () depois.

Quando você tem poucas listas, mas você não sabe exatamente quantas, use isto:

listsOfProducts contém poucas listas preenchidas com objects.

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

Eu sei que esta é uma pergunta antiga que eu pensei que poderia adicionar meus 2 centavos.

Se você tem uma List[] você pode se juntar a eles usando Aggregate

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

Espero que isto ajude.