Vinicius Quaiato

{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}

QuickTip: juntando duas listas


Uma amiga (@lekaverta) me perguntou se havia uma maneira simples, em C#, de juntar o conteúdo de duas List<T> sem ficar fazendo foreach.

Existem pelo menos umas três formas de fazer isso com pouco código, vamos ver alguns desses exemplos simples.

Juntando duas List<T> com AddRange

1 [TestMethod]
2 public void Deve_Juntar_Duas_Listas_Com_AddRange(){
3   var lista1 = new List&lt;string&gt; { "a", "b", "c" };
4   var lista2 = new List&lt;string&gt; { "e", "d", "f" };
5   lista1.AddRange(lista2);
6   CollectionAssert.IsSubsetOf(lista2, lista1);
7 }

Acima adicionamos a lista2 inteira dentro da lista1. Nos certificamos disso na linha 6, verificando que a lista2 é um subset da lista1, ou seja, a lista1 contém a lista2.Notem que AddRange é um membro da classe List<T> e não da interface IList<T>.

Juntando duas List<T> com Union

1 [TestMethod]
2 public void Deve_Juntar_Duas_Listas_Com_Union(){
3   var lista1 = new List&lt;string&gt; { "a", "b", "c" };
4   var lista2 = new List&lt;string&gt; { "e", "d", "f" };
5   var merged = lista1.Union(lista2).ToList();
6   CollectionAssert.IsSubsetOf(lista2, merged);
7   CollectionAssert.IsSubsetOf(lista1, merged);
8 }

Union, do Linq, nos permite fazer a união de duas listas, resultando em um novo IEnumerable. Desta vez eu verifico que as duas listas são um subset desta nova lista gerada.É importante ressaltar que o Union não duplica elementos iguais presentes nas duas listas, como vemos abaixo:

[TestMethod]
public void Deve_Juntar_Duas_Listas_Com_Union(){
  var lista1 = new List&lt;string&gt; { "a", "b", "c" };
  var lista2 = new List&lt;string&gt; { "e", "b", "f" };
  var merged = lista1.Union(lista2).ToList();

  CollectionAssert.IsSubsetOf(lista2, merged);
  CollectionAssert.IsSubsetOf(lista1, merged);
  CollectionAssert.AllItemsAreUnique(merged);
}

No código acima o elemento "b" está presente nas duas listas, mas na linha 12 garantimos que todos os itens da nova lista são únicos.

Juntando duas List<T> com Concat

[TestMethod]
public void Deve_Juntar_Duas_Listas_Com_Concat(){
  var lista1 = new List&lt;string&gt; { "a", "b", "c" };
  var lista2 = new List&lt;string&gt; { "e", "b", "f" };
  var merged = lista1.Concat(lista2).ToList();

  CollectionAssert.IsSubsetOf(lista2, merged);
  CollectionAssert.IsSubsetOf(lista1, merged);
}

Aqui novamente uma nova lista é gerada, no entanto itens iguais são mantidos. O Concat também faz parte do Linq.

Resumo da ópera

Temos então 3 formas simples de juntar duas listas de dados:AddRangeUnioneConcatAgora vocês podem juntar suas listas sem fazer tantos foreach, deixando o código um pouco mais legível e limpo.

Voltar

Fork me on GitHub