{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
28/09/2010
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.
1 [TestMethod]
2 public void Deve_Juntar_Duas_Listas_Com_AddRange(){
3 var lista1 = new List<string> { "a", "b", "c" };
4 var lista2 = new List<string> { "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>.
1 [TestMethod]
2 public void Deve_Juntar_Duas_Listas_Com_Union(){
3 var lista1 = new List<string> { "a", "b", "c" };
4 var lista2 = new List<string> { "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<string> { "a", "b", "c" };
var lista2 = new List<string> { "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.
[TestMethod]
public void Deve_Juntar_Duas_Listas_Com_Concat(){
var lista1 = new List<string> { "a", "b", "c" };
var lista2 = new List<string> { "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.
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.