¿Cómo se concatenan listas en C#?
Si tengo:
List<string> myList1;
List<string> myList2;
myList1 = getMeAList();
// Checked myList1, it contains 4 strings
myList2 = getMeAnotherList();
// Checked myList2, it contains 6 strings
myList1.Concat(myList2);
// Checked mylist1, it contains 4 strings... why?
Ejecuté un código similar a este en Visual Studio 2008 y establecí puntos de interrupción después de cada ejecución. Después myList1 = getMeAList();
contiene myList1
cuatro cadenas y presioné el botón más para asegurarme de que no fueran todas nulas.
After myList2 = getMeAnotherList();
contiene myList2
seis cadenas y verifiqué para asegurarme de que no fueran nulas... After myList1.Concat(myList2);
myList1 contenía solo cuatro cadenas. ¿Porqué es eso?
Concat
Devuelve una nueva secuencia sin modificar la lista original . Intentar myList1.AddRange(myList2)
.
Prueba esto:
myList1 = myList1.Concat(myList2).ToList();
Concat devuelve un IEnumerable<T> que son las dos listas juntas, no modifica ninguna de las listas existentes. Además, dado que devuelve un IEnumerable, si desea asignarlo a una variable que es List<T>, tendrá que llamar a ToList() en el IEnumerable<T> que se devuelve.
También vale la pena señalar que Concat funciona en tiempo constante y en memoria constante. Por ejemplo, el siguiente código
long boundary = 60000000;
for (long i = 0; i < boundary; i++)
{
list1.Add(i);
list2.Add(i);
}
var listConcat = list1.Concat(list2);
var list = listConcat.ToList();
list1.AddRange(list2);
proporciona las siguientes métricas de tiempo/memoria:
After lists filled mem used: 1048730 KB
concat two enumerables: 00:00:00.0023309 mem used: 1048730 KB
convert concat to list: 00:00:03.7430633 mem used: 2097307 KB
list1.AddRange(list2) : 00:00:00.8439870 mem used: 2621595 KB