.NET List <T> Concat vs AddRange

Respostas:

122

Eles têm semânticas totalmente diferentes.

AddRange modifica a lista adicionando os outros itens a ela.

Concat retorna uma nova sequência contendo a lista e os outros itens, sem modificar a lista.

Escolha o que tiver a semântica desejada.

Greg Beech
fonte
1
Então, em um loop apertado, seria muito melhor usar intervalo adicional para não perder desempenho devido a todas as novidades internas e batendo no GC?
johnc
43
Na verdade, devido à execução adiada, usar o Concat provavelmente seria mais rápido porque evita a alocação de objetos - o Concat não copia nada, ele apenas cria links entre as listas, então quando enumerar e você chegar ao final de uma, ele o levará de forma transparente para o início do próximo!
Greg Beech
36

A grande diferença é que AddRange modifica aquela lista contra a qual é chamado, enquanto Concat cria uma nova lista. Portanto, eles têm usos diferentes.

Além disso, Concat é um método de extensão que se aplica a qualquer IEnumerable e retorna um IEnumerable. Você precisa de um .ToList () para resultar em uma nova List.

Se você quiser estender o conteúdo de uma lista existente, use AddRange.

Se você estiver criando uma nova lista de duas fontes IEnumerable, use Concat com .ToList. Isso tem a qualidade de não alterar nenhuma das fontes.

Se você precisar apenas enumerar o conteúdo de duas Listas (ou qualquer outro IEnumerable), basta usar Concat todas as vezes, isso tem a vantagem de não alocar de fato nova memória para manter a lista unificada.

AnthonyWJones
fonte
3
+1, Na verdade, se você esquecer de 'tolist', concat silenciosamente não faz nada
smirkingman
7

Achei este artigo interessante falando sobre a diferença entre essas 2 estruturas e comparando seu desempenho ...

A ideia principal é que AddRange é muito mais rápido quando se trata de coleções de tamanho grande.

Aqui está o link

Espero que isto ajude,

Haithem KAROUI
fonte
1
Fiz um teste comparando Concate AddRangecom um List<KeyValuePair<string, string>>com 1000 elementos, concatenado / adicionado 100 vezes, e AddRangefoi extremamente mais rápido. Os resultados foram os seguintes: AddRange13 ms, Concat().ToList()16.000 ms, e Concatao IEnumerablefazer apenas o ToListno final: 2.700 ms.
Andrew