Suche…


Bemerkungen

Eine ReadOnlyCollection bietet eine schreibgeschützte Ansicht für eine vorhandene Auflistung (die 'Quellauflistung').

Elemente werden nicht direkt zu einer ReadOnlyCollection hinzugefügt oder daraus entfernt. Sie werden stattdessen hinzugefügt und aus der Quellensammlung entfernt, und die ReadOnlyCollection gibt diese Änderungen an der Quelle wieder.

Die Anzahl und Reihenfolge der Elemente in einer ReadOnlyCollection kann nicht geändert werden. Die Eigenschaften der Elemente und die Methoden können jedoch aufgerufen werden, sofern sie im Gültigkeitsbereich liegen.

Verwenden Sie eine ReadOnlyCollection wenn Sie externen Code erlauben möchten, Ihre Sammlung anzuzeigen, ohne sie ändern zu können. Sie können die Sammlung jedoch weiterhin selbst ändern.

Siehe auch

  • ObservableCollection<T>
  • ReadOnlyObservableCollection<T>

ReadOnlyCollections vs ImmutableCollection

Eine ReadOnlyCollection unterscheidet sich von einer ImmutableCollection dass Sie eine ImmutableCollection nicht bearbeiten können, wenn Sie sie erstellt haben. Sie enthält immer n Elemente und kann nicht ersetzt oder neu angeordnet werden. Eine ReadOnlyCollection kann dagegen nicht direkt bearbeitet werden. Elemente können jedoch weiterhin mit der Quellensammlung hinzugefügt / entfernt / neu angeordnet werden.

ReadOnlyCollection erstellen

Verwenden des Konstruktors

Eine ReadOnlyCollection wird erstellt, indem ein vorhandenes IList Objekt an den Konstruktor übergeben wird:

var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);

LINQ verwenden

Zusätzlich bietet LINQ eine AsReadOnly() Erweiterungsmethode für IList Objekte:

var readOnlyVersion = groceryList.AsReadOnly();

Hinweis

Normalerweise möchten Sie die Quellensammlung privat pflegen und öffentlichen Zugriff auf die ReadOnlyCollection gewähren. Während Sie eine ReadOnlyCollection aus einer Inline-Liste erstellen konnten, können Sie die Sammlung nach dem Erstellen nicht mehr ändern.

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!

Wenn Sie dies tun, möchten Sie möglicherweise eine andere Datenstruktur verwenden, z. B. eine ImmutableCollection .

Aktualisieren einer ReadOnlyCollection

Eine ReadOnlyCollection kann nicht direkt bearbeitet werden. Stattdessen wird die Quellensammlung aktualisiert und die ReadOnlyCollection berücksichtigt diese Änderungen. Dies ist die ReadOnlyCollection der 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 anzeigen

Warnung: Elemente in einer ReadOnlyCollection sind an sich nicht schreibgeschützt

Wenn die Quellensammlung nicht unveränderlich ist, können Elemente, auf die über eine ReadOnlyCollection zugegriffen wird, geändert werden.

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 anzeigen



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow