我正在寻找一个只读通用集合库,它是与.NET v3.5兼容的常见System.Collections.Generic;
集合的.NET版本的镜像(或者更确切地说是实现或扩展)。
我猜想F#可能有一些只读集合(但我不确定它们是否实现了System.Collections.Generic中的接口)。除此之外,我宁愿不在服务器上安装F#。我想我可以简单地部署F#dll(s),如果这是可行的,我怀疑它是。
是否有一个只读通用集合类库,它们实现System.Collections.Generic中的接口并提供相同的性能(或更好)特性?例如,随机访问数组支持IList的实现(仅限只读)。
答案 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);
}
}
这样,MyReadOnlyCollection
和list
的状态不会改变。
答案 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>