2010-04-15 18 views
18

Ich habe eine Liste, und ich möchte nur Lesezugriff auf eine Sammlung bieten, die ihren Inhalt enthält. Wie kann ich das machen?C#: Unveränderbare Ansicht von Objekten einer Liste?

Etwas wie:

public ICollection<Foo> ImmutableViewOfInventory() { 

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

    inventory.add(new Foo()); 

    return inventory.ImmutableView(); 

} 

Zusätzlich ein unveränderliches IEnumerable wäre auch in Ordnung sein.

UPDATE: Ich realisiere jetzt, dass eine unveränderliche Ansicht der Liste tatsächlich besser wäre. (Preserving Liste Ordnungs Semantik.)

Das wird mir nicht Liste Verhalten geben, rechts:

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

Ich bin in der Dokumentation suchen, aber nicht sofort ReadOnlyList<T> sehen.

+3

Möchten Sie eine unveränderliche Ansicht der Liste oder eine unveränderliche Ansicht einer Reihe von unveränderlichen Elementen aus der Liste? – adrianbanks

Antwort

20

Wenn Sie eine unveränderliche Liste der Elemente fehlen, können Sie ein ReadOnlyCollection durch den Aufruf der AsReadOnly() Methode auf Ihrer Liste zurück:

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

Diese eine Implementierung von IList zurückgibt, die beide stark typisierte und nicht modifizierbar.

Es tut nicht jedoch verhindern Änderungen an einem der Elemente in der Liste (es sei denn, sie sind Werttypen). Dazu muss jedes Element geklont (tief geklont, wenn es selbst andere Objekte enthält) und einer neuen schreibgeschützten Liste hinzugefügt werden, die von Ihrer ImmutableViewOfInventory-Methode zurückgegeben wird. Das müssen Sie leider selbst umsetzen.

+0

Aus irgendeinem Grund kann ich 'inventar.AsReadOnly()' nicht kompilieren, obwohl ich 'System.Collections.Generic' importiert habe. Es besagt, dass die Methode nicht existiert. –

+0

Eigentlich, weil ich eine 'IList' anstelle einer' List' verwendet habe. Warum ist es nicht auf "IList" verfügbar? –

0

neue Readonlycollection (Inventar);

Verwandte Themen