.NET Framework
ReadOnlyCollections
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"
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);
}