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