Comment concaténer des listes en C #?

Si j’ai:

List myList1; List myList2; myList1 = getMeAList(); // Checked myList1, it contains 4 ssortingngs myList2 = getMeAnotherList(); // Checked myList2, it contains 6 ssortingngs myList1.Concat(myList2); // Checked mylist1, it contains 4 ssortingngs... why? 

J’ai exécuté du code similaire à celui-ci dans Visual Studio 2008 et défini des points d’arrêt après chaque exécution. Après myList1 = getMeAList(); , myList1 contient quatre chaînes, et j’ai appuyé sur le bouton plus pour s’assurer qu’elles n’étaient pas toutes nulles.

Après myList2 = getMeAnotherList(); , myList2 contient six chaînes, et j’ai vérifié pour s’assurer qu’elles n’étaient pas nulles … Après myList1.Concat(myList2); myList1 ne contenait que quatre chaînes. Pourquoi donc?

Concat renvoie une nouvelle séquence sans modifier la liste d’origine . Essayez myList1.AddRange(myList2) .

Essaye ça:

 myList1 = myList1.Concat(myList2).ToList(); 

Concat renvoie un IEnumerable qui correspond aux deux listes assemblées, il ne modifie aucune des listes existantes. De plus, comme il retourne un IEnumerable, si vous voulez l’affecter à une variable qui est List , vous devrez appeler ToList () sur le IEnumerable renvoyé.

Concat ne met pas à jour myList1 . Il renvoie une nouvelle liste contenant myList1 et myList2 concaténées.

Utilisez myList1.AddRange(myList2) .

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

Ca marche bien je le pense. Comme indiqué précédemment, Concat renvoie une nouvelle séquence et lors de la conversion du résultat en liste, il fait parfaitement le travail.

Il convient également de noter que Concat travaille en temps constant et en mémoire constante. Par exemple, le code suivant

  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); 

donne les mésortingques de synchronisation / mémoire suivantes:

 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 

Je sais que c’est vieux mais je suis tombé sur ce post rapidement en pensant que Concat serait ma réponse. Union a très bien fonctionné pour moi. Notez que cela ne renvoie que des valeurs uniques, mais sachant que je recevais des valeurs uniques, cette solution a fonctionné pour moi.

 namespace TestProject { public partial class Form1 :Form { public Form1() { InitializeComponent(); List FirstList = new List(); 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 secondList = GetList(FirstList); foreach (ssortingng item in secondList) Console.WriteLine(item); } private List GetList(List SortBy) { List list = new List(); list.Add("One"); list.Add("Two"); list.Add("Three"); list = list.Union(SortBy).ToList(); return list; } } } 

La sortie est la suivante:

 One Two Three 1234 4567 

jetez un coup d’oeil à ma mise en œuvre its safe from null lists

  IList all= new List(); 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 ssortingng variable) so wrap it inside list then concat it all = all.Concat(new []{letterForm.DepartmentManagerPhone}).ToList();