.NET Framework
ReadOnlyCollections
Ricerca…
Osservazioni
Un ReadOnlyCollection fornisce una vista di sola lettura a una raccolta esistente (la 'collezione di origine').
Gli oggetti non vengono aggiunti o rimossi direttamente da ReadOnlyCollection . Invece, vengono aggiunti e rimossi dalla raccolta di origine e ReadOnlyCollection rifletterà queste modifiche all'origine.
Il numero e l'ordine degli elementi all'interno di ReadOnlyCollection non possono essere modificati, ma le proprietà degli elementi possono essere e i metodi possono essere chiamati, presupponendo che siano in ambito.
Utilizzare ReadOnlyCollection quando si desidera consentire al codice esterno di visualizzare la raccolta senza essere in grado di modificarla, ma è comunque possibile modificare la raccolta autonomamente.
Guarda anche
-
ObservableCollection<T> -
ReadOnlyObservableCollection<T>
ReadOnlyCollections vs ImmutableCollection
A ReadOnlyCollection differenzia da ImmutableCollection in quanto non è possibile modificare un ImmutableCollection dopo averlo creato: esso contiene sempre n elementi e non possono essere sostituiti o riordinati. Una ReadOnlyCollection , d'altra parte, non può essere modificata direttamente, ma gli elementi possono ancora essere aggiunti / rimossi / riordinati utilizzando la raccolta di origine.
Creare un ReadOnlyCollection
Uso del Costruttore
Un ReadOnlyCollection viene creato passando un oggetto IList esistente nel costruttore:
var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);
Utilizzando LINQ
Inoltre, LINQ fornisce un metodo di estensione AsReadOnly() per oggetti IList :
var readOnlyVersion = groceryList.AsReadOnly();
Nota
In genere, si desidera mantenere la raccolta di origine in privato e consentire l'accesso pubblico a ReadOnlyCollection . Mentre è possibile creare un ReadOnlyCollection da un elenco in linea, non sarebbe possibile modificare la raccolta dopo averla creata.
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!
Se ti accorgi di farlo, potresti prendere in considerazione l'utilizzo di un'altra struttura dati, come ImmutableCollection .
Aggiornamento di ReadOnlyCollection
Un ReadOnlyCollection non può essere modificato direttamente. Invece, la collezione di origine viene aggiornata e ReadOnlyCollection rifletterà queste modifiche. Questa è la caratteristica chiave di 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"
Avvertenza: gli elementi di ReadOnlyCollection non sono intrinsecamente di sola lettura
Se la raccolta di origine è di un tipo non immutabile, è possibile modificare gli elementi accessibili tramite ReadOnlyCollection .
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);
}