2010-04-15 22 views
18

我有一個列表,我想爲包含其內容的集合提供只讀訪問權限。我怎樣才能做到這一點?C#:列表對象的不可變視圖?

喜歡的東西:

public ICollection<Foo> ImmutableViewOfInventory() { 

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

    inventory.add(new Foo()); 

    return inventory.ImmutableView(); 

} 

此外,一個不可變IEnumerable也將被罰款。

更新:我現在意識到列表的不可變視圖實際上會更好。 (保留列表排序語義。)

這不會給我列表的行爲,右:

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

我要找的文件中,但不會立即看到ReadOnlyList<T>

+3

你想要列表的不可變視圖,還是列表中一組不可變項目的不可變視圖? – adrianbanks 2010-04-15 23:24:16

回答

20

如果你想要的物品的不可變列表,你可以通過調用AsReadOnly()方法您的名單返回ReadOnlyCollection修改。

它的確如此而不是但是阻止更改列表中包含的任何項目(除非它們是值類型)。爲此,必須克隆每個項目(如果它們自己包含其他對象,則進行深度克隆),並將其添加到從您的ImmutableViewOfInventory方法返回的新的只讀列表中。不幸的是你必須自己實現。

+0

因爲某些原因,我不能'inventory.AsReadOnly()'來編譯,即使我已經導入了'System.Collections.Generic'。它說該方法不存在。 – 2010-04-15 23:49:33

+0

其實,那是因爲我使用的是「IList」而不是「List」。爲什麼不能在'IList'上使用? – 2010-04-15 23:54:58

0

新ReadOnlyCollection(庫存);

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

這返回的IList實現既強類型,而不是: