.NET Framework
ReadOnlyCollections
Поиск…
замечания
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);
}