Comment concaténer les listes en C#?
si j'ai:
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?
j'ai lancé un code similaire à celui-ci dans Visual Studio 2008 et j'ai mis des points d'arrêt après chaque exécution. Après myList1 = getMeAList();
, myList1
contient quatre cordes, et j'ai appuyé sur le bouton plus pour m'assurer qu'elles n'étaient pas toutes nulles.
après myList2 = getMeAnotherList();
, myList2
contient six chaînes, et j'ai vérifié qu'elles n'étaient pas nulles... Après myList1.Concat(myList2);
, myList1 ne contenait que quatre cordes. Pourquoi est-ce?
7 réponses
Concat
renvoie une nouvelle séquence sans modifier la liste originale . Essayez myList1.AddRange(myList2)
.
essayez ceci:
myList1 = myList1.Concat(myList2).ToList();
Concat retourne un IEnumerable
Concat n'est pas mise à jour myList1
. Il retourne une nouvelle liste contenant les concaténés myList1
et myList2
.
Use
myList1.AddRange(myList2)
à la place.
targetList = list1.Concat(list2).ToList();
ça marche très bien. Comme dit précédemment, Concat retourne une nouvelle séquence et tout en convertissant le résultat en liste, il fait le travail parfaitement.
il est également intéressant de noter que Concat fonctionne 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 paramètres de temps/mémoire suivants:
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 venu sur ce poste rapidement pensant Concat serait ma réponse. Le syndicat a bien travaillé pour moi. Notez qu'il ne renvoie que des valeurs uniques, mais sachant que je recevais des valeurs uniques de toute façon, cette solution a fonctionné pour moi.
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;
}
}
}
la sortie est:
One
Two
Three
1234
4567
regardez mon implémentation 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();