¿Cómo se concatenan listas en C#?

Resuelto Matt asked hace 15 años • 6 respuestas

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 myList1cuatro cadenas y presioné el botón más para asegurarme de que no fueran todas nulas.

After myList2 = getMeAnotherList();contiene myList2seis cadenas y verifiqué para asegurarme de que no fueran nulas... After myList1.Concat(myList2);myList1 contenía solo cuatro cadenas. ¿Porqué es eso?

Matt avatar Jun 25 '09 11:06 Matt
Aceptado

ConcatDevuelve una nueva secuencia sin modificar la lista original . Intentar myList1.AddRange(myList2).

John Kugelman avatar Jun 25 '2009 04:06 John Kugelman

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.

Jonathan Rupp avatar Jun 25 '2009 04:06 Jonathan Rupp

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
Dmitry Andrievsky avatar Nov 22 '2014 01:11 Dmitry Andrievsky