У чому різниця між функціями AddRange і Concat у загальному списку? Чи рекомендується одне над іншим?
У чому різниця між функціями AddRange і Concat у загальному списку? Чи рекомендується одне над іншим?
Відповіді:
Вони мають абсолютно різну семантику.
AddRange змінює список, додаючи до нього інші елементи.
Concat повертає нову послідовність, що містить список та інші елементи, не змінюючи списку.
Виберіть, який із них має потрібну вам семантику.
Велика різниця полягає в тому, що AddRange мутує той список, щодо якого він викликаний, тоді як Concat створює новий Список. Тому вони мають різне використання.
Також Concat - це метод розширення, який застосовується до будь-якого IEnumerable і повертає IEnumerable, який вам потрібен .ToList (), щоб отримати новий Список.
Якщо ви хочете розширити вміст існуючого списку, використовуйте AddRange.
Якщо ви створюєте новий список із двох джерел IEnumerable, використовуйте Concat із .ToList. Це має таку якість, що не мутує жодне з джерел.
Якщо вам коли-небудь потрібно буде перерахувати вміст двох Списків (або будь-якого іншого IEnumerable), тоді просто використовуйте Concat кожного разу, це має ту перевагу, що насправді не виділяє нову пам'ять для зберігання єдиного списку.
Я знайшов цю цікаву статтю, яка розповідає про різницю між цими 2 структурами та порівняння їх продуктивності ...
Основна ідея полягає в тому, що AddRange набагато швидший, коли йдеться про великі колекції.
Ось посилання
Сподіваюся, це допомагає,
Concat
та AddRange
з a List<KeyValuePair<string, string>>
з 1000 елементами, об'єднаний / доданий 100 разів, і AddRange
був надзвичайно швидшим. Результати були такі: AddRange
13 мс, Concat().ToList()
16,000 мс, і Concat
на умовах IEnumerable
робити тільки ToList
в кінці 2700 мс.