2010-04-15 8 views
18

Tengo una lista y deseo proporcionar acceso de solo lectura a una colección que contenga sus contenidos. ¿Cómo puedo hacer esto?C#: ¿Vista inmutable de los objetos de una lista?

Algo así como:

public ICollection<Foo> ImmutableViewOfInventory() { 

    IList<Foo> inventory = new List<Foo>(); 

    inventory.add(new Foo()); 

    return inventory.ImmutableView(); 

} 

Además, un inmutable IEnumerable también estaría bien.

ACTUALIZACIÓN: Me doy cuenta ahora de que una vista inmutable de la lista sería realmente mejor. (Preservar la semántica lista de pedidos.)

Esto no me dará comportamiento de la lista, a la derecha:

public ReadOnlyCollection<PickUp> InventoryItems() 
    { 
     return new ReadOnlyCollection<PickUp>(inventory); 
    } 

Busco en la documentación pero no ver de inmediato ReadOnlyList<T>.

+3

¿Desea una vista inmutable de la lista o una vista inmutable de un conjunto de elementos inmutables de la lista? – adrianbanks

Respuesta

20

Si estás interesado en una lista inmutable de los elementos, puede devolver un ReadOnlyCollection llamando al método AsReadOnly() en su lista:

public IList<Foo> ImmutableViewOfInventory() 
{ 
    List<Foo> inventory = new List<Foo>(); 
    inventory.Add(new Foo()); 
    return inventory.AsReadOnly(); 
} 

Esto devuelve una implementación de IList que es a la vez inflexible y no modificable

No no, sin embargo, impide los cambios a cualquiera de los elementos que figuran en la lista (a menos que sean tipos de valores). Para hacer eso, cada elemento debe ser clonado (clonado a fondo si contienen otros objetos) y agregado a una nueva lista de solo lectura que se devuelve desde su método ImmutableViewOfInventory. Tendrás que implementar esto tú mismo por desgracia.

+0

Por alguna razón no puedo 'inventory.AsReadOnly()' para compilar, aunque he importado 'System.Collections.Generic'. Dice que el método no existe. –

+0

En realidad, eso es porque estaba usando un 'IList' en lugar de una' Lista'. ¿Por qué no está disponible en 'IList'? –

0

nueva ReadOnlyCollection (inventario);

Cuestiones relacionadas