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"

Visualizza la demo

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

Visualizza la demo



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow