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


Відповіді:


122

Вони мають абсолютно різну семантику.

AddRange змінює список, додаючи до нього інші елементи.

Concat повертає нову послідовність, що містить список та інші елементи, не змінюючи списку.

Виберіть, який із них має потрібну вам семантику.


1
Отже, іонів тісний цикл, було б набагато краще використовувати доданий діапазон, щоб не втратити продуктивність завдяки всім внутрішнім новинкам і стуканням ГХ?
johnc

43
Насправді, через відкладене виконання, використання Concat, швидше за все, було б швидшим, оскільки воно уникає розподілу об’єктів - Concat нічого не копіює, він просто створює зв’язки між списками, тому під час перерахування та досягнення кінця одного він прозоро веде вас до початку наступного!
Greg Beech

36

Велика різниця полягає в тому, що AddRange мутує той список, щодо якого він викликаний, тоді як Concat створює новий Список. Тому вони мають різне використання.

Також Concat - це метод розширення, який застосовується до будь-якого IEnumerable і повертає IEnumerable, який вам потрібен .ToList (), щоб отримати новий Список.

Якщо ви хочете розширити вміст існуючого списку, використовуйте AddRange.

Якщо ви створюєте новий список із двох джерел IEnumerable, використовуйте Concat із .ToList. Це має таку якість, що не мутує жодне з джерел.

Якщо вам коли-небудь потрібно буде перерахувати вміст двох Списків (або будь-якого іншого IEnumerable), тоді просто використовуйте Concat кожного разу, це має ту перевагу, що насправді не виділяє нову пам'ять для зберігання єдиного списку.


3
+1, Дійсно, якщо ви забудете "перерахувати", конкат мовчки нічого не робить
smirkingman

7

Я знайшов цю цікаву статтю, яка розповідає про різницю між цими 2 структурами та порівняння їх продуктивності ...

Основна ідея полягає в тому, що AddRange набагато швидший, коли йдеться про великі колекції.

Ось посилання

Сподіваюся, це допомагає,


1
Я провів тест порівняння Concatта AddRangeз a 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.