.NET Framework
ReadOnlyCollections
Zoeken…
Opmerkingen
Een ReadOnlyCollection
biedt een alleen-lezen weergave van een bestaande collectie (de 'broncollectie').
Items worden niet rechtstreeks toegevoegd aan of verwijderd uit een ReadOnlyCollection
. In plaats daarvan worden ze toegevoegd aan en verwijderd uit de ReadOnlyCollection
en de ReadOnlyCollection
zal deze wijzigingen in de bron weergeven.
Het aantal en de volgorde van elementen in een ReadOnlyCollection
kan niet worden gewijzigd, maar de eigenschappen van de elementen wel en de methoden kunnen worden aangeroepen, ervan uitgaande dat ze binnen het bereik vallen.
Gebruik een ReadOnlyCollection
als u externe code uw verzameling wilt laten bekijken zonder deze te kunnen wijzigen, maar de verzameling toch zelf kunt wijzigen.
Zie ook
-
ObservableCollection<T>
-
ReadOnlyObservableCollection<T>
ReadOnlyCollections versus ImmutableCollection
Een ReadOnlyCollection
verschilt van een ImmutableCollection
in ImmutableCollection
dat u een ImmutableCollection
niet kunt bewerken nadat u deze hebt gemaakt - deze zal altijd n
elementen bevatten en ze kunnen niet worden vervangen of opnieuw worden gerangschikt. Een ReadOnlyCollection
kan daarentegen niet rechtstreeks worden bewerkt, maar elementen kunnen nog steeds worden toegevoegd / verwijderd / opnieuw worden gerangschikt met behulp van de broncollectie.
Een ReadOnlyCollection maken
De constructor gebruiken
Een ReadOnlyCollection
wordt gemaakt door een bestaand IList
object door te geven aan de constructor:
var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);
LINQ gebruiken
Daarnaast biedt LINQ een AsReadOnly()
IList
voor IList
objecten:
var readOnlyVersion = groceryList.AsReadOnly();
Notitie
Doorgaans wilt u de ReadOnlyCollection
privé houden en openbare toegang tot de ReadOnlyCollection
toestaan. Hoewel u een ReadOnlyCollection
vanuit een in-line lijst kunt maken, kunt u de verzameling niet meer wijzigen nadat u deze hebt gemaakt.
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!
Als u merkt dat u dit doet, kunt u overwegen een andere gegevensstructuur te gebruiken, zoals een ImmutableCollection
.
Een ReadOnlyCollection bijwerken
Een ReadOnlyCollection
kan niet rechtstreeks worden bewerkt. In plaats daarvan wordt de ReadOnlyCollection
bijgewerkt en zal de ReadOnlyCollection
deze wijzigingen weerspiegelen. Dit is het belangrijkste kenmerk van de 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"
Waarschuwing: elementen in een ReadOnlyCollection zijn niet inherent alleen-lezen
Als de bronverzameling van een type is dat niet onveranderlijk is, kunnen elementen waartoe toegang is verkregen via een ReadOnlyCollection
worden gewijzigd.
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);
}