without unir two lists listas array c# arrays list concatenation

unir - ¿Cómo concatenas las listas en C#?



merge list c# (7)

Concat no actualiza myList1 devuelve una nueva lista que contiene myList1 y myList2 concatenadas.

Use myList1.AddRange(myList2) lugar.

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é código similar a este en Visual Studio 2008 y establecí los puntos de interrupción después de cada ejecución. Después de myList1 = getMeAList(); , myList1 contiene cuatro cadenas, y presioné el botón más para asegurarme de que no fueran todas nulas.

Después de myList2 = getMeAnotherList(); , myList2 contiene seis cadenas y revisé para asegurarme de que no fueran nulas ... Después de myList1.Concat(myList2); myList1 contenía solo cuatro cadenas. ¿Porqué es eso?


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.


Sé que esto es viejo, pero me encontré con esta publicación rápidamente pensando que Concat sería mi respuesta. Union funcionó muy bien para mí. Tenga en cuenta que solo devuelve valores únicos, pero sabiendo que obtuve valores únicos de todos modos, esta solución funcionó para mí.

namespace TestProject { public partial class Form1 :Form { public Form1() { InitializeComponent(); List<string> FirstList = new List<string>(); FirstList.Add("1234"); FirstList.Add("4567"); // In my code, I know I would not have this here but I put it in as a demonstration that it will not be in the secondList twice FirstList.Add("Three"); List<string> secondList = GetList(FirstList); foreach (string item in secondList) Console.WriteLine(item); } private List<String> GetList(List<string> SortBy) { List<string> list = new List<string>(); list.Add("One"); list.Add("Two"); list.Add("Three"); list = list.Union(SortBy).ToList(); return list; } } }

El resultado es:

One Two Three 1234 4567


También vale la pena señalar que Concat trabaja 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);

da 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


mira mi implementación its safe from null lists

IList<string> all= new List<string>(); if (letterForm.SecretaryPhone!=null)// first list may be null all=all.Concat(letterForm.SecretaryPhone).ToList(); if (letterForm.EmployeePhone != null)// second list may be null all= all.Concat(letterForm.EmployeePhone).ToList(); if (letterForm.DepartmentManagerName != null) // this is not list (its just string variable) so wrap it inside list then concat it all = all.Concat(new []{letterForm.DepartmentManagerPhone}).ToList();



targetList = list1.Concat(list2).ToList();

Está funcionando bien, creo que sí. Como se dijo anteriormente, Concat devuelve una nueva secuencia y, al convertir el resultado en Lista, hace el trabajo perfectamente.