.NET List <T> Concat против AddRange


Ответы:


123

У них совершенно разная семантика.

AddRange изменяет список, добавляя в него другие элементы.

Concat возвращает новую последовательность, содержащую список и другие элементы, без изменения списка.

Выберите тот, который имеет желаемую семантику.


1
Итак, если замкнутый цикл, было бы намного лучше использовать дополнительный диапазон, чтобы не потерять производительность из-за всех внутренних изменений и ударов GC?
johnc

45
На самом деле, из-за отложенного выполнения использование Concat, вероятно, будет быстрее, потому что оно позволяет избежать выделения объектов - Concat ничего не копирует, он просто создает ссылки между списками, поэтому при перечислении и достижении конца одного он прозрачно переносит вас к началу следующего!
Грег Бич

36

Большая разница в том, что AddRange изменяет тот список, для которого он вызывается, тогда как Concat создает новый List. Следовательно, они используются по-разному.

Также Concat - это метод расширения, который применяется к любому IEnumerable и возвращает IEnumerable, который вам нужен .ToList () для создания нового списка.

Если вы хотите расширить содержимое существующего списка, используйте AddRange.

Если вы создаете новый список из двух источников IEnumerable, используйте Concat с .ToList. У этого есть то качество, что он не изменяет ни один из источников.

Если вам нужно только перечислить содержимое двух списков (или любого другого IEnumerable), просто используйте Concat каждый раз, это имеет то преимущество, что фактически не выделяется новая память для хранения единого списка.


3
+1, Действительно, если вы забыли «tolist», concat молча ничего не делает
smirkingman

7

Я нашел эту интересную статью, в которой рассказывается о разнице между этими двумя структурами и сравнивается их производительность ...

Основная идея заключается в том, что AddRange намного быстрее, когда речь идет о коллекциях большого размера.

Вот ссылка

Надеюсь это поможет,


1
Я сделал тест сравнения Concatи AddRangeс List<KeyValuePair<string, string>>1000 элементов, сцепляются / добавляемых в 100 раз, и AddRangeбыл чрезвычайно быстрее. Результаты были следующие: AddRange13 мс, Concat().ToList()16 000 мс, а Concatпри IEnumerableвыполнении только ToListв конце: 2700 мс.
Эндрю
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.