Поиск…


замечания

ReadOnlyCollection предоставляет ReadOnlyCollection для чтения к существующей коллекции («коллекция источников»).

Элементы не добавляются непосредственно или удаляются из ReadOnlyCollection . Вместо этого они добавляются и удаляются из исходной коллекции, и ReadOnlyCollection будет отражать эти изменения в источнике.

Число и порядок элементов внутри ReadOnlyCollection не могут быть изменены, но свойства элементов могут быть и методы могут быть вызваны, если предположить, что они находятся в области видимости.

Используйте ReadOnlyCollection если вы хотите разрешить внешнему коду просматривать свою коллекцию, не изменяя ее, но все же можете самостоятельно модифицировать коллекцию.

Смотрите также

  • ObservableCollection<T>
  • ReadOnlyObservableCollection<T>

ReadOnlyCollections vs ImmutableCollection

ReadOnlyCollection отличается от ImmutableCollection тем, что вы не можете редактировать ImmutableCollection после его создания - он всегда будет содержать n элементов, и их нельзя заменить или переупорядочить. С другой стороны, ReadOnlyCollection нельзя редактировать напрямую, но элементы все равно могут быть добавлены / удалены / переупорядочены с использованием исходной коллекции.

Создание ReadOnlyCollection

Использование конструктора

ReadOnlyCollection создается путем передачи существующего объекта IList в конструктор:

var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);

Использование LINQ

Дополнительно, LINQ предоставляет метод расширения AsReadOnly() для объектов IList :

var readOnlyVersion = groceryList.AsReadOnly();

Заметка

Как правило, вы хотите сохранить исходную коллекцию конфиденциально и разрешить публичный доступ к ReadOnlyCollection . Хотя вы можете создать ReadOnlyCollection из встроенного списка, вы не сможете изменить коллекцию после ее создания.

var readOnlyGroceryList = new List<string> {"Apple", "Banana"}.AsReadOnly();
// Great, but you will not be able to update the grocery list because 
//  you do not have a reference to the source list anymore!

Если вы это сделаете, вы можете захотеть использовать другую структуру данных, такую ​​как ImmutableCollection .

Обновление ReadOnlyCollection

ReadOnlyCollection нельзя редактировать напрямую. Вместо этого исходная коллекция обновляется, и ReadOnlyCollection будет отражать эти изменения. Это ключевая особенность ReadOnlyCollection .

var groceryList = new List<string> { "Apple", "Banana" };

var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);

var itemCount = readOnlyGroceryList.Count;  // There are currently 2 items

//readOnlyGroceryList.Add("Candy");         // Compiler Error - Items cannot be added to a ReadOnlyCollection object
groceryList.Add("Vitamins");                // ..but they can be added to the original collection

itemCount = readOnlyGroceryList.Count;      // Now there are 3 items
var lastItem = readOnlyGroceryList.Last();  // The last item on the read only list is now "Vitamins"

Посмотреть демо

Предупреждение. Элементы в ReadOnlyCollection не являются неотъемлемо доступными для чтения

Если исходная коллекция имеет тип, который не является неизменным, элементы, доступные через ReadOnlyCollection могут быть изменены.

public class Item
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public static void FillOrder()
{
    // An order is generated
    var order = new List<Item>
    {
        new Item { Name = "Apple", Price = 0.50m },
        new Item { Name = "Banana", Price = 0.75m },
        new Item { Name = "Vitamins", Price = 5.50m }
    };

    // The current sub total is $6.75
    var subTotal = order.Sum(item => item.Price);

    // Let the customer preview their order
    var customerPreview = new ReadOnlyCollection<Item>(order);

    // The customer can't add or remove items, but they can change 
    //   the price of an item, even though it is a ReadOnlyCollection
    customerPreview.Last().Price = 0.25m;

    // The sub total is now only $1.50!
    subTotal = order.Sum(item => item.Price);
}

Посмотреть демо



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow