Список только для чтения или неизменяемый список в.NET 4.0

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

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

С помощью 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 свойство индексатора

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

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

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

Создайте метод расширения 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;
    }
}

см . ответ Мартина тоже

Другие вопросы по тегам