0

我正在寻找一个只读通用集合库,它是System.Collections.Generic;与.NET v3.5 兼容的通用集合的.NET 版本的镜像(或者更确切地说是实现或扩展)。

我猜想 F# 可能有一些只读集合(但我不确定它们是否实现了 System.Collections.Generic 的接口)。除此之外,我宁愿不在服务器上安装 F#。我想我也许可以简单地部署 F# dll,如果可行的话,我怀疑是这样。

是否有实现 System.Collections.Generic 中的接口并提供相同性能(或更好)特性的只读通用集合类库?例如,IList 的随机访问数组支持的实现(只读)。

4

4 回答 4

6

如果您想要不可变集合,而不仅仅是只读集合,您可能会对Microsoft 的不可变集合预览感兴趣。

中的大多数类都有对应项System.Collections.Generic

于 2013-02-01T16:18:16.163 回答
3

ReadOnlyCollection<T>在_System.Collections.ObjectModel

它是您想要的任何集合的包装器。最常见的是使用 aList<T>并用ReadOnlyCollection<T>.

然后,在公共实现中,您只授予访问权限ReadOnlyCollection<T>并将其设置List<T>为私有。

public class MyClass
{
    private List<MyItemClass> list;
    public ReadOnlyCollection<MyItemClass> MyReadOnlyCollection { get; private set; }

    public MyClass()
    {
        list = new List<MyItemClass>() { ... };
        MyReadOnlyCollection = new ReadOnlyCollection<MyItemClass>(list);
    }
}

如果你想要一个“不可变对象”:

public class MyClass
{
    public ReadOnlyCollection<MyItemClass> MyReadOnlyCollection { get; private set; }

    public MyClass()
    {
        List<MyItemClass> list = new List<MyItemClass>() { ... };
        MyReadOnlyCollection = new ReadOnlyCollection<MyItemClass>(list);
    }
}

这样, ofMyReadOnlyCollection和 of的状态list就不会改变。

于 2013-02-01T16:16:30.933 回答
0

你应该看看 System.Collection.ObjectModel。

那里有一个只读字典、列表和可观察列表。

他们可以很好地处理任何可枚举的东西。

于 2013-02-01T16:17:30.760 回答
0

根据您的要求,将集合公开为 可能就足够了IEnumerable<T>,它本质上是只读的:

var list = new List<int> {1,2,3,4};
var coll = list.AsEnumerable(); //read-only interface

但是,调用者仍然可以将集合转换为具体类型以使其可变:

var backToList = (List<int>)coll; //now it's mutable again

您还可以选择使用 a ReadOnlyCollection<T>,它没有上述问题:

var readonlyCollection = list.AsReadOnly(); // returns a ReadOnlyCollection<int>
于 2013-02-01T16:26:38.860 回答