2008-09-19 6 views

Répondre

94

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.

+0

Donc, une boucle serrée, il serait préférable d'utiliser la plage d'ajout afin de ne pas perdre de performance en raison de tout le renouvellement interne et le martèlement du GC? – johnc

+33

En fait, en raison de l'exécution différée, utiliser Concat serait probablement plus rapide parce qu'il * évite * l'allocation d'objet - Concat ne copie rien, il crée simplement des liens entre les listes pour l'énumération et vous atteignez la fin au début de la prochaine! –

28

La grande différence est que AddRange mute cette liste contre laquelle il est appelé alors que Concat crée une nouvelle liste. Par conséquent, ils ont des utilisations différentes.

Aussi Concat est une méthode d'extension qui s'applique à tout IEnumerable et renvoie un IEnumerable vous avez besoin d'un .ToList() pour aboutir à une nouvelle liste.

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é qu'il ne mute pas non plus de sources.

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

+0

+1, En effet, si vous oubliez de «tolist», concat ne fait rien en silence – smirkingman