Список только для чтения или неизменяемый список в.NET 4.0
Из того, что я могу сказать, .NET 4.0 по-прежнему не хватает списков только для чтения. Почему фреймворку все еще не хватает этой функциональности? Разве это не один из самых распространенных элементов функциональности для доменного дизайна?
Одно из немногих преимуществ Java по сравнению с C# заключается в форме метода Collections.unmodifiablelist(list), который, по-видимому, давно пора в IList
С помощью IEnumerable<T>
самое простое решение вопроса - ToList
может быть использован и возвращает копию.
7 ответов
Ты ищешь ReadOnlyCollection
, который был вокруг с.NET2.
IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);
или же
List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();
Это создает представление только для чтения, которое отражает изменения, внесенные в упакованную коллекцию.
Для тех, кто любит использовать интерфейсы:
.NET 4.5 добавляет общий IReadOnlyList
интерфейс, который реализуется List<T>
например.
Это похоже на IReadOnlyCollection
и добавляет Item
свойство индексатора
Если наиболее распространенным шаблоном списка является перебор всех элементов, IEnumerable<T>
или же IQueryable<T>
может эффективно действовать как список только для чтения.
В 2.0 вы можете позвонить AsReadOnly
чтобы получить версию списка только для чтения. Или обернуть существующий IList
в ReadOnlyCollection<T>
объект.
Что не так с System.Collections.ObjectModel.ReadOnlyCollection?
Создайте метод расширения ToReadOnlyList () в IEnumerable, затем
IEnumerable<int> ints = new int[] { 1, 2, 3 };
var intsReadOnly = ints.ToReadOnlyList();
//intsReadOnly [2]= 9; //compile error, readonly
вот метод расширения
public static class Utility
{
public static IReadOnlyList<T> ToReadOnlyList<T>(this IEnumerable<T> items)
{
IReadOnlyList<T> rol = items.ToList();
return rol;
}
}
см . ответ Мартина тоже