Jaka jest różnica między funkcjami AddRange i Concat na ogólnej liście? Czy jeden jest lepszy od drugiego?
Jaka jest różnica między funkcjami AddRange i Concat na ogólnej liście? Czy jeden jest lepszy od drugiego?
Odpowiedzi:
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ę.
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.
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,
Concat
oraz AddRange
z List<KeyValuePair<string, string>>
1000 elementów, łączone / dodaje się 100 razy, a AddRange
był bardzo szybciej. Wyniki były następujące: AddRange
13 ms, Concat().ToList()
16 000 ms, a Concat
przy IEnumerable
robieniu tylko ToList
na końcu: 2700 ms.