Qual è la differenza tra le funzioni AddRange e Concat su un elenco generico? Uno è consigliato rispetto all'altro?
Risposte:
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.
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.
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,
Concat
e AddRange
con un List<KeyValuePair<string, string>>
con 1000 elementi, concatenato / aggiunto 100 volte ed è AddRange
stato estremamente più veloce. I risultati sono stati questi: AddRange
13 ms, Concat().ToList()
16.000 ms, e Concat
su un IEnumerable
fare solo la ToList
alla fine: 2.700 ms.