188 votes

Comment concaténer des listes en C# ?

Si je l'ai fait :

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 exécuté un code similaire à celui-ci dans Visual Studio 2008 et j'ai défini des points d'arrêt après chaque exécution. Après myList1 = getMeAList(); , myList1 contient quatre chaînes de caractères, 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); maListe1 ne contenait que quatre chaînes de caractères. Comment cela se fait-il ?

337voto

John Kugelman Points 108754

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

106voto

Jonathan Rupp Points 10900

Essayez ça :

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

Concat retourne un IEnumerable<T> qui est les deux listes réunies, il ne modifie aucune des deux listes existantes. De plus, puisqu'elle retourne un IEnumerable, si vous voulez l'assigner à une variable qui est List<T>, vous devrez appeler ToList() sur l'IEnumerable<T> qui est retourné.

7 votes

Maintenant que j'ai relu la question, .AddRange() semble être ce que le PO veut vraiment.

0 votes

@Kartiikeya s'il dit que les arguments ne sont pas valides, c'est que vous n'avez pas de déclaration d'utilisation pour System.Linq, ou que l'un d'entre eux n'est pas un IEnumerable<T>

12voto

Jacob Points 33729

Concat ne se met pas à jour myList1 il renvoie une nouvelle liste contenant la concaténation de myList1 y myList2 .

Utilisez myList1.AddRange(myList2) à la place.

12voto

Balasubramani M Points 538
targetList = list1.Concat(list2).ToList();

Je pense que ça fonctionne bien. Comme dit précédemment, Concat renvoie une nouvelle séquence et en convertissant le résultat en liste, il fait parfaitement son travail.

6voto

Dmitry Andrievsky Points 1078

Il convient également 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 mesures de temps/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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X