.NET List <T> Concat vs AddRange

Respuestas:

122

Tienen una semántica totalmente diferente.

AddRange modifica la lista agregando los otros elementos a ella.

Concat devuelve una nueva secuencia que contiene la lista y los otros elementos, sin modificar la lista.

Elija el que tenga la semántica que desee.

Greg Beech
fuente
1
Entonces, en un circuito cerrado, sería mucho mejor usar agregar rango para no perder rendimiento debido a todas las novedades internas y golpes del GC.
johnc
43
En realidad, debido a la ejecución diferida, el uso de Concat probablemente sea más rápido porque evita la asignación de objetos: Concat no copia nada, solo crea enlaces entre las listas, por lo que al enumerar y llegar al final de una, lo lleva de manera transparente al principio. del siguiente!
Greg Beech
36

La gran diferencia es que AddRange muta la lista contra la que se llama, mientras que Concat crea una nueva lista. De ahí que tengan diferentes usos.

Además, Concat es un método de extensión que se aplica a cualquier IEnumerable y devuelve un IEnumerable, necesita un .ToList () para generar una nueva Lista.

Si desea ampliar el contenido de una lista existente, utilice AddRange.

Si está creando una nueva lista a partir de dos fuentes IEnumerable, utilice Concat con .ToList. Esto tiene la cualidad de que no muta ninguna de las fuentes.

Si solo necesita enumerar el contenido de dos Listas (o cualquier otro IEnumerable), simplemente use Concat cada vez, esto tiene la ventaja de no asignar nueva memoria para contener la lista unificada.

AnthonyWJones
fuente
3
+1, de hecho, si te olvidas de 'tolist', concat silenciosamente no hace nada
smirkingman
7

Encontré este interesante artículo hablando de la diferencia entre estas 2 estructuras y comparando su rendimiento ...

La idea principal es que AddRange es mucho más rápido cuando se trata de colecciones de gran tamaño.

Aquí está el enlace

Espero que esto ayude,

Haithem KAROUI
fuente
1
Hice una prueba comparando Concaty AddRangecon List<KeyValuePair<string, string>>1000 elementos, concatené / agregué 100 veces y AddRangefue extremadamente más rápido. Los resultados fueron estos: AddRange13 ms, Concat().ToList()16,000 ms, y Concatal IEnumerablehacer solo el ToListal final: 2,700 ms.
Andrew