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"

Visa demo

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

Visa demo



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow