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