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.

Greg Beech
la source
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.

AnthonyWJones
la source
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,

Haithem KAROUI
la source
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