É possível converter duas ou mais listas em uma única lista, no .NET usando C #?
Por exemplo,
public static List<Product> GetAllProducts(int categoryId){ .... }
.
.
.
var productCollection1 = GetAllProducts(CategoryId1);
var productCollection2 = GetAllProducts(CategoryId2);
var productCollection3 = GetAllProducts(CategoryId3);
AddRange
-Método?Respostas:
Você pode usar o LINQ
Concat
e osToList
métodos:Observe que existem maneiras mais eficientes de fazer isso - o que foi dito acima basicamente percorre todas as entradas, criando um buffer de tamanho dinâmico. Como você pode prever o tamanho, para começar, não precisa desse dimensionamento dinâmico ... para poder usar:
(
AddRange
é especialmente indicadoICollection<T>
para eficiência.)Eu não adotaria essa abordagem a menos que você realmente precise.
fonte
productCollection1.ForEach(p => allProducts.Add(p))
é mais eficiente que AddRange.AddRange
faz uma cópia de bloco de uma matriz subjacente para outra. Você tem algum link para evidência disso?productionCollection1.ForEach(...)
é mais eficiente que AddRange". O desempenho é muito raramente descrito com tanta facilidade. Eu estou surpreso que AddRange não está batendo-o com folga embora - Eu preciso investigar isso ainda mais.AddRange
é a melhor opção para velocidade bruta (cerca de 4x e quanto maior a lista, melhor o aumento), como Jon suggeste.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 . Há um operador LINQ que faz isso:
SelectMany
.No C # 4, você pode reduzir o SelectMany para:
.SelectMany(GetAllProducts)
Se você já possui listas representando os produtos para cada ID, o que você precisa é de uma concatenação , como outros apontam.
fonte
você pode combiná-los usando o LINQ:
a abordagem mais tradicional do uso
List.AddRange()
pode ser mais eficiente.fonte
Dê uma olhada em List.AddRange para mesclar listas
fonte
Você pode usar o método de extensão Concat :
fonte
fonte
Eu sei que esta é uma pergunta antiga que eu pensei em adicionar apenas meus 2 centavos.
Se você tiver um,
List<Something>[]
pode se juntar a eles usandoAggregate
Espero que isto ajude.
fonte
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, o uso
source.ForEach(p => dest.Add(p))
é melhor que o clássico,AddRange
mas não investiguei o porquê no nível baixo.Você pode ver um código de exemplo aqui: https://gist.github.com/mcliment/4690433
Portanto, a opção seria:
Teste para ver se funciona para você.
Isenção de responsabilidade : não estou advogando por esta solução, acho
Concat
a mais clara. Acabei de afirmar - na minha discussão com Jon - que, na minha máquina, esse caso tem um desempenho melhor do queAddRange
, mas ele diz, com muito mais conhecimento do que eu, que isso não faz sentido. Existe a essência se você quiser comparar.fonte
var allProducts = lstName.Concat(lstCMSID) .Concat(lstSpecialtyPhys) .ToList();
que o adiciona ao GridView, mas como uma coluna. Eu gostaria de dividi-los em três colunas separadas.Dessa forma, é uma lista multidimensional e o .SelectMany () o achatará em um IEnumerable de produto e, depois, uso o método .ToList ().
fonte
Para mesclar ou Combinar para listas em uma lista Um.
Há uma coisa que deve ser verdadeira: o tipo de ambas as listas será igual.
Por exemplo : se tivermos lista de
string
, podemos adicionar uma outra lista à lista existente, que possui uma lista do tipo string, caso contrário, não podemos.Exemplo :
fonte
No caso especial: "Todos os elementos da Lista1 vão para uma nova Lista2": (por exemplo, uma lista de cadeias)
Nesse caso, a lista2 é gerada com todos os elementos da lista1.
fonte
Você precisa usar a operação Concat
fonte
Quando você tiver poucas listas, mas não souber exatamente quantas, use o seguinte:
listsOfProducts
contém poucas listas preenchidas com objetos.fonte