.NET Framework
ReadOnlyCollections
Sök…
Anmärkningar
En ReadOnlyCollection
ger en skrivskyddad vy till en befintlig samling ('källsamlingen').
Objekt läggs inte direkt till eller tas bort från en ReadOnlyCollection
. Istället läggs de till och tas bort från källsamlingen och ReadOnlyCollection
återspeglar dessa ändringar i källan.
Antalet och ordningen på element i en ReadOnlyCollection
kan inte ändras, men elementens egenskaper kan vara och metoderna kan anropas, förutsatt att de är i omfattning.
Använd en ReadOnlyCollection
när du vill tillåta extern kod att visa din samling utan att kunna ändra den, men ändå kunna ändra samlingen själv.
Se även
-
ObservableCollection<T>
-
ReadOnlyObservableCollection<T>
ReadOnlyCollections vs ImmutableCollection
En ReadOnlyCollection
skiljer sig från en ImmutableCollection
att du inte kan redigera en ImmutableCollection
när du skapade den - den kommer alltid att innehålla n
element, och de kan inte ersättas eller ordnas om. En ReadOnlyCollection
kan å andra sidan inte redigeras direkt, men element kan fortfarande läggas till / tas bort / ordnas om med källsamlingen.
Skapa en ReadOnlyCollection
Använda konstruktören
En ReadOnlyCollection
skapas genom att skicka ett befintligt IList
objekt till konstruktören:
var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);
Använda LINQ
Dessutom tillhandahåller LINQ en AsReadOnly()
förlängningsmetod för IList
objekt:
var readOnlyVersion = groceryList.AsReadOnly();
Notera
Vanligtvis vill du behålla källsamlingen privat och tillåta allmänhetens åtkomst till ReadOnlyCollection
. Medan du kan skapa en ReadOnlyCollection
från en in-line lista, skulle du inte kunna ändra samlingen efter att du skapade den.
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!
Om du tycker att du gör detta kan du överväga att använda en annan datastruktur, till exempel en ImmutableCollection
.
Uppdatera en ReadOnlyCollection
En ReadOnlyCollection
kan inte redigeras direkt. Istället uppdateras ReadOnlyCollection
och ReadOnlyCollection
återspeglar dessa förändringar. Detta är nyckelfunktionen i 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"
Varning: Element i en ReadOnlyCollection är inte enbart skrivskyddade
Om källsamlingen är av en typ som inte kan ändras kan element som nås via en ReadOnlyCollection
ändras.
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);
}