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"

Demo bekijken

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);
}

Demo bekijken



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow