Вопрос по linq, list, .net, extension-methods – .NET List <T> Concat против AddRange

73

В чем разница междуAddRange а такжеConcat функции в общем списке? Один рекомендуется по сравнению с другим?

Ваш Ответ

3   ответа
29

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

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

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

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

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

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

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

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

ЗдесьСсылка на сайт

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

102

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

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

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

Выберите тот, который имеет семантику вы хотите.

На самом деле, из-за отложенного выполнения, использование Concat, вероятно, будет быстрее, потому чтоavoids распределение объектов - Concat ничего не копирует, он просто создает связи между списками, поэтому при перечислении и достижении конца одного он прозрачно переносит вас в начало следующего!
Итак, в тесной петле, было бы намного лучше использовать дополнительный диапазон, чтобы не потерять производительность из-за внутреннего обновления и обстрела ГХ? johnc

Похожие вопросы