2010-04-15 3 views
18

J'ai une liste, et je veux fournir un accès en lecture seule à une collection contenant son contenu. Comment puis-je faire ceci?C#: Vue immuable des objets d'une liste?

Quelque chose comme:

public ICollection<Foo> ImmutableViewOfInventory() { 

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

    inventory.add(new Foo()); 

    return inventory.ImmutableView(); 

} 

De plus, un IEnumerable immuable serait aussi bien.

MISE À JOUR: Je réalise maintenant qu'une vue immuable de la liste serait réellement meilleure. (Préserver la sémantique de commande de la liste.)

Cela ne me donne pas le comportement de la liste, à droite:

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

Je suis à la recherche dans la documentation, mais ne pas voir immédiatement ReadOnlyList<T>.

+3

Voulez-vous une vue immuable de la liste, ou une vue immuable d'un ensemble d'éléments immuables de la liste? – adrianbanks

Répondre

20

Si vous manquez une liste immuable des éléments, vous pouvez retourner une ReadOnlyCollection en appelant la méthode AsReadOnly() sur votre liste:

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

Cela renvoie une implémentation de IList qui est à la fois fortement typé et non modifiable.

Il ne pas cependant empêcher les modifications à l'un des éléments contenus dans la liste (à moins qu'ils ne soient des types de valeur). Pour ce faire, chaque élément doit être cloné (clonage en profondeur s'il contient lui-même d'autres objets) et ajouté à une nouvelle liste en lecture seule renvoyée par votre méthode ImmutableViewOfInventory. Vous devrez l'implémenter vous-même malheureusement.

+0

Pour une raison quelconque, je ne peux pas 'inventory.AsReadOnly()' compiler, même si j'ai importé 'System.Collections.Generic'. Il dit que la méthode n'existe pas. –

+0

En fait, c'est parce que j'utilisais un 'IList' au lieu d'un' List'. Pourquoi n'est-il pas disponible sur 'IList'? –

0

nouveau ReadOnlyCollection (inventaire);

Questions connexes