.NET Framework
ReadOnlyCollections
Szukaj…
Uwagi
ReadOnlyCollection
zapewnia widok tylko do odczytu dla istniejącej kolekcji („kolekcja źródłowa”).
Elementy nie są bezpośrednio dodawane ani usuwane z ReadOnlyCollection
. Zamiast tego są one dodawane i usuwane z kolekcji źródłowej, a ReadOnlyCollection
odzwierciedla te zmiany w źródle.
Liczby i kolejności elementów w ReadOnlyCollection
nie można modyfikować, ale właściwości elementów mogą być, a metody można wywoływać, zakładając, że są w zakresie.
Skorzystaj z ReadOnlyCollection
jeśli chcesz zezwolić zewnętrznemu kodowi na przeglądanie Twojej kolekcji bez możliwości jej modyfikacji, ale nadal możesz samodzielnie modyfikować kolekcję.
Zobacz też
-
ObservableCollection<T>
-
ReadOnlyObservableCollection<T>
ReadOnlyCollection vs ImmutableCollection
ReadOnlyCollection
różni się od ImmutableCollection
tym, że nie można edytować ImmutableCollection
po jej utworzeniu - zawsze będzie zawierało n
elementów i nie będzie można ich zastąpić ani zmienić kolejności. Z drugiej strony ReadOnlyCollection
nie można edytować bezpośrednio, ale elementy można nadal dodawać / usuwać / zmieniać kolejność za pomocą kolekcji źródłowej.
Tworzenie ReadOnlyCollection
Korzystanie z konstruktora
ReadOnlyCollection
jest tworzony przez przekazanie istniejącego obiektu IList
do konstruktora:
var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);
Korzystanie z LINQ
Dodatkowo LINQ zapewnia metodę rozszerzenia AsReadOnly()
dla obiektów IList
:
var readOnlyVersion = groceryList.AsReadOnly();
Uwaga
Zazwyczaj chcesz zachować kolekcję źródłową prywatnie i umożliwić publiczny dostęp do ReadOnlyCollection
. Chociaż można utworzyć kolekcję ReadOnlyCollection
z listy w wierszu, nie można modyfikować kolekcji po jej utworzeniu.
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!
Jeśli to robisz, możesz rozważyć użycie innej struktury danych, takiej jak ImmutableCollection
.
Aktualizowanie kolekcji ReadOnlyCollection
ReadOnlyCollection
nie może być edytowany bezpośrednio. Zamiast tego kolekcja źródłowa jest aktualizowana, a ReadOnlyCollection
odzwierciedli te zmiany. Jest to kluczowa cecha 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"
Ostrzeżenie: elementy w ReadOnlyCollection nie są z natury tylko do odczytu
Jeśli kolekcja źródłowa jest typu, który nie jest niezmienny, elementy dostępne za pośrednictwem ReadOnlyCollection
można modyfikować.
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);
}