C#:列表对象的不可变视图?

Nic*_*ner 20 c# immutability

我有一个列表,我想提供对包含其内容的集合的只读访问权限.我怎样才能做到这一点?

就像是:

public ICollection<Foo> ImmutableViewOfInventory() {

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

    inventory.add(new Foo());

    return inventory.ImmutableView();

}
Run Code Online (Sandbox Code Playgroud)

另外,一个不可变的IEnumerable也没关系.

更新:我现在意识到列表的不可变视图实际上会更好.(保留列表排序语义.)

这不会给我列表行为,对:

    public ReadOnlyCollection<PickUp> InventoryItems()
    {
        return new ReadOnlyCollection<PickUp>(inventory);
    }
Run Code Online (Sandbox Code Playgroud)

我正在查看文档,但没有立即看到ReadOnlyList<T>.

adr*_*nks 24

如果您想要一个不可变的项列表,可以通过调用列表中的AsReadOnly()方法返回ReadOnlyCollection:

public IList<Foo> ImmutableViewOfInventory() 
{
    List<Foo> inventory = new List<Foo>();
    inventory.Add(new Foo());
    return inventory.AsReadOnly();
}
Run Code Online (Sandbox Code Playgroud)

这将返回IList强类型且不可修改的实现.

它并没有然而,防止更改任何包含在列表中的项目(除非它们是值类型).为此,必须克隆每个项目(如果它们本身包含其他对象,则进行深度克隆),并将其添加到从ImmutableViewOfInventory方法返回的新只读列表中.不幸的是,你必须自己实现这一点.