Список только для чтения или неизменяемый список в .NET 4.0 - PullRequest
95 голосов
/ 12 июня 2009

Насколько я могу судить, в .NET 4.0 по-прежнему отсутствуют списки только для чтения. Почему фреймворку все еще не хватает этой функциональности? Разве это не одна из самых распространенных функциональных возможностей для доменного дизайна ?

Одно из немногих преимуществ, которые Java имеет перед C #, заключается в форме Collections.unmodifiablelist (list) , который, похоже, давно просрочен в IList или List .

Использование IEnumerable<T> - самое простое решение вопроса - можно использовать ToList и вернуть копию.

Ответы [ 6 ]

140 голосов
/ 12 июня 2009

Вы ищете ReadOnlyCollection, который существует с .NET2.

IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);

или

List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();

Это создает доступное только для чтения представление , которое отражает изменения, внесенные в упакованную коллекцию.

13 голосов
/ 12 июня 2009

Как насчет ReadOnlyCollection уже в рамках?

11 голосов
/ 07 сентября 2015

Для тех, кто любит использовать интерфейсы: .NET 4.5 добавляет общий интерфейс IReadOnlyList, который реализован, например, List<T>.

Он похож на IReadOnlyCollection и добавляет Item свойство индексатора.

11 голосов
/ 12 июня 2009

Если наиболее распространенным шаблоном списка является итерация по всем элементам, IEnumerable<T> или IQueryable<T> также может эффективно действовать как список только для чтения.

7 голосов
/ 12 июня 2009
7 голосов
/ 12 июня 2009

В 2.0 вы можете позвонить AsReadOnly, чтобы получить версию списка только для чтения. Или оберните существующий IList в ReadOnlyCollection<T> объект.

...