Buscar..


Observaciones

Una ReadOnlyCollection proporciona una vista de solo lectura a una colección existente (la 'colección de origen').

Los elementos no se agregan o eliminan directamente de ReadOnlyCollection . En su lugar, se agregan y eliminan de la colección de origen y ReadOnlyCollection reflejará estos cambios en el origen.

El número y el orden de los elementos dentro de una ReadOnlyCollection no pueden modificarse, pero las propiedades de los elementos pueden ser y los métodos pueden llamarse, asumiendo que están dentro del alcance.

Use ReadOnlyCollection cuando desee permitir que un código externo vea su colección sin poder modificarla, pero aún así podrá modificar la colección usted mismo.

Ver también

  • ObservableCollection<T>
  • ReadOnlyObservableCollection<T>

ReadOnlyCollections vs ImmutableCollection

Una ReadOnlyCollection difiere de una ImmutableCollection en que no puede editar una ImmutableCollection una vez que la creó; siempre contendrá n elementos, y no se pueden reemplazar ni reordenar. Una ReadOnlyCollection , por otro lado, no se puede editar directamente, pero los elementos todavía se pueden agregar / eliminar / reordenar usando la colección de origen.

Creando una colección ReadOnly

Usando el constructor

Una ReadOnlyCollection se crea al pasar un objeto IList existente al constructor:

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

Usando LINQ

Adicionalmente, LINQ proporciona un método de extensión AsReadOnly() para objetos IList :

var readOnlyVersion = groceryList.AsReadOnly();

Nota

Normalmente, desea mantener la colección de origen de forma privada y permitir el acceso público a ReadOnlyCollection . Si bien puede crear una ReadOnlyCollection de una lista en línea, no podrá modificar la colección después de crearla.

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!

Si se encuentra haciendo esto, puede considerar usar otra estructura de datos, como ImmutableCollection .

Actualizando una ReadOnlyCollection

Una ReadOnlyCollection no se puede editar directamente. En su lugar, la colección de origen se actualiza y ReadOnlyCollection reflejará estos cambios. Esta es la característica clave de 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"

Ver demostración

Advertencia: los elementos de ReadOnlyCollection no son inherentemente de solo lectura

Si la colección de origen es de un tipo que no es inmutable, los elementos a los que se accede a través de ReadOnlyCollection se pueden modificar.

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

Ver demostración



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow