Elenco .NET <T> Concat vs AddRange


Risposte:


122

Hanno una semantica completamente diversa.

AddRange modifica l'elenco aggiungendovi gli altri elementi.

Concat restituisce una nuova sequenza contenente l'elenco e gli altri elementi, senza modificare l'elenco.

Scegli quello che ha la semantica che desideri.


1
Quindi, in un circuito stretto, sarebbe molto meglio usare la gamma aggiuntiva per non perdere le prestazioni a causa di tutte le novità interne e il martellamento del GC?
johnc

43
In realtà, a causa dell'esecuzione differita, l'uso di Concat sarebbe probabilmente più veloce perché evita l' allocazione degli oggetti: Concat non copia nulla, crea solo collegamenti tra gli elenchi, quindi quando si enumera e si raggiunge la fine di uno, si porta in modo trasparente all'inizio del prossimo!
Greg Beech

36

La grande differenza è che AddRange modifica l'elenco in base al quale viene chiamato mentre Concat crea un nuovo elenco. Quindi hanno usi diversi.

Inoltre Concat è un metodo di estensione che si applica a qualsiasi IEnumerable e restituisce un IEnumerable, è necessario un .ToList () per ottenere un nuovo List.

Se vuoi estendere il contenuto di un elenco esistente usa AddRange.

Se stai creando un nuovo elenco da due sorgenti IEnumerable, usa Concat con .ToList. Questo ha la qualità che non muta nessuna delle sorgenti.

Se è necessario enumerare solo il contenuto di due elenchi (o qualsiasi altro oggetto IEnumerable), utilizzare semplicemente Concat ogni volta, questo ha il vantaggio di non allocare effettivamente nuova memoria per contenere l'elenco unificato.


3
+1, In effetti, se ti dimentichi di 'tolist', concat silenziosamente non fa nulla
smirkingman

7

Ho trovato questo articolo interessante che parla della differenza tra queste 2 strutture e ne confronta le prestazioni ...

L'idea principale è che AddRange è molto più veloce quando si tratta di collezioni di grandi dimensioni.

Ecco il collegamento

Spero che questo ti aiuti,


1
Ho fatto un test di confronto Concate AddRangecon un List<KeyValuePair<string, string>>con 1000 elementi, concatenato / aggiunto 100 volte ed è AddRangestato estremamente più veloce. I risultati sono stati questi: AddRange13 ms, Concat().ToList()16.000 ms, e Concatsu un IEnumerablefare solo la ToListalla fine: 2.700 ms.
Andrew
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.