.NET List <T> Concat vs AddRange

Odpowiedzi:

124

Mają zupełnie inną semantykę.

AddRange modyfikuje listę, dodając do niej inne elementy.

Concat zwraca nową sekwencję zawierającą listę i inne elementy, bez modyfikowania listy.

Wybierz tę, która ma odpowiednią semantykę.

Greg Beech
źródło
1
Więc jeśli chodzi o ciasną pętlę, znacznie lepiej byłoby użyć zakresu dodawania, aby nie stracić wydajności z powodu całego wewnętrznego odświeżania i uderzania GC?
johnc,
46
Właściwie, ze względu na odroczone wykonanie, użycie Concat byłoby prawdopodobnie szybsze, ponieważ pozwala uniknąć alokacji obiektów - Concat niczego nie kopiuje, po prostu tworzy łącza między listami, więc podczas wyliczania i dotarcia do końca jednej z nich przejrzyście przenosi Cię na początek następnego!
Greg Beech,
37

Duża różnica polega na tym, że AddRange mutuje listę, względem której jest wywoływana, podczas gdy Concat tworzy nową listę. Dlatego mają różne zastosowania.

Ponadto Concat jest metodą rozszerzającą, która ma zastosowanie do dowolnego IEnumerable i zwraca IEnumerable, którego potrzebujesz .ToList (), aby uzyskać nową Listę.

Jeśli chcesz rozszerzyć zawartość istniejącej listy, użyj AddRange.

Jeśli tworzysz nową listę z dwóch źródeł IEnumerable, użyj Concat z .ToList. Ma to tę zaletę, że nie powoduje mutacji żadnego ze źródeł.

Jeśli kiedykolwiek potrzebujesz wyliczyć zawartość dwóch list (lub dowolnego innego IEnumerable), po prostu użyj Concat za każdym razem, ma to tę zaletę, że w rzeczywistości nie przydzielasz nowej pamięci do przechowywania ujednoliconej listy.

AnthonyWJones
źródło
3
+1, rzeczywiście, jeśli zapomnisz o `` tolist '', concat po cichu nic nie robi
smirkingman
7

Znalazłem ten interesujący artykuł, w którym omówiono różnicę między tymi 2 strukturami i porównałem ich wydajność ...

Główną ideą jest to, że AddRange działa znacznie szybciej, gdy chodzi o kolekcje o dużych rozmiarach.

Oto link

Mam nadzieję że to pomoże,

Haithem KAROUI
źródło
1
Zrobiłem test porównujący Concatoraz AddRangez List<KeyValuePair<string, string>>1000 elementów, łączone / dodaje się 100 razy, a AddRangebył bardzo szybciej. Wyniki były następujące: AddRange13 ms, Concat().ToList()16 000 ms, a Concatprzy IEnumerablerobieniu tylko ToListna końcu: 2700 ms.
Andrew