是否有一组C#数据只读通用集合/数据结构?

时间:2013-02-01 16:15:26

标签: c# collections f#

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

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

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

4 个答案:

答案 0 :(得分:6)

如果您想要 immutable ,而不仅仅是只读,那么您可能会对Microsoft's preview of immutable collections感兴趣。

System.Collections.Generic中的大部分课程都有对应部分。

答案 1 :(得分:3)

System.Collections.ObjectModel

中的ReadOnlyCollection<T>

它是您想要的任何集合的包装器。 最常见的是使用List<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);
    }
}

这样,MyReadOnlyCollectionlist的状态不会改变。

答案 2 :(得分:0)

你应该看一下System.Collection.ObjectModel。

你有一个只读字典,列表和可观察列表。

他们对任何可枚举的东西都很好。

答案 3 :(得分: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

您还可以选择使用ReadOnlyCollection<T>,但上面没有问题:

var readonlyCollection = list.AsReadOnly(); // returns a ReadOnlyCollection<int>