Liste .NET <T> Concat vs AddRange


Réponses:


122

Ils ont une sémantique totalement différente.

AddRange modifie la liste en y ajoutant les autres éléments.

Concat renvoie une nouvelle séquence contenant la liste et les autres éléments, sans modifier la liste.

Choisissez celui qui a la sémantique souhaitée.


1
Donc, dans une boucle serrée, il serait beaucoup mieux d'utiliser une plage supplémentaire pour ne pas perdre les performances en raison de toutes les nouveautés internes et du martèlement du GC?
johnc

42
En fait, en raison d'une exécution différée, l'utilisation de Concat serait probablement plus rapide car elle évite l' allocation d'objets - Concat ne copie rien, il crée simplement des liens entre les listes, donc lors de l'énumération et que vous atteignez la fin de celle-ci, il vous amène de manière transparente au début du prochain!
Greg Beech

36

La grande différence est que AddRange mute la liste par rapport à laquelle il est appelé tandis que Concat crée une nouvelle liste. Par conséquent, ils ont des utilisations différentes.

Concat est également une méthode d'extension qui s'applique à n'importe quel IEnumerable et renvoie un IEnumerable dont vous avez besoin d'un .ToList () pour générer une nouvelle List.

Si vous souhaitez étendre le contenu d'une liste existante, utilisez AddRange.

Si vous créez une nouvelle liste à partir de deux sources IEnumerable, utilisez Concat avec .ToList. Cela a la qualité de ne muter aucune des sources.

Si vous avez seulement besoin d'énumérer le contenu de deux listes (ou de tout autre IEnumerable), utilisez simplement Concat à chaque fois, cela a l'avantage de ne pas allouer de nouvelle mémoire pour contenir la liste unifiée.


3
+1, en effet, si vous oubliez de `` tolérer '', concat ne fait rien en silence
sourire narquois

7

J'ai trouvé cet article intéressant parlant de la différence entre ces 2 structures et comparant leurs performances ...

L'idée principale est qu'AddRange est beaucoup plus rapide lorsqu'il s'agit de collections de grande taille.

Voici le lien

J'espère que cela t'aides,


1
J'ai fait un test en comparant Concatet AddRangeavec un List<KeyValuePair<string, string>>avec 1000 éléments, concaténés / ajoutés 100 fois, et AddRangec'était extrêmement plus rapide. Les résultats ont été les suivants: AddRange13 ms, Concat().ToList()16 000 ms, et Concatsur une IEnumerableseule action ToListà la fin: 2 700 ms.
Andrew le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.