是否有一组 C# 数据只读泛型集合/数据结构
本文关键字:只读 数据 泛型 集合 数据结构 一组 是否 | 更新日期: 2023-09-27 17:56:56
我正在寻找一个只读泛型集合库,这些集合是镜像(或者更确切地说是实现或扩展)与 .NET v3.5 兼容的常见System.Collections.Generic;
集合的 .NET 版本。
我猜 F# 可能有许多只读集合(但我不确定它们是否实现了 System.Collections.Generic 的接口)。 除此之外,我宁愿不在服务器上安装 F#。我想我也许可以简单地部署 F# dll(s),如果这是可行的,我怀疑它是
。是否有只读泛型集合类库来实现 System.Collections.Generic 中的接口并提供相同的性能(或更好)特征? 例如,随机访问数组支持 IList 的实现(仅只读)。
如果你想要不可变的集合,而不仅仅是只读的集合,你可能会对Microsoft的不可变集合预览感兴趣。
System.Collections.Generic
中的大多数类都有对应项。
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
的状态就不会改变。
你应该看看System.Collection.ObjectModel。
在那里,您有一个只读字典,列表和可观察列表。
他们与任何可枚举的东西都玩得很好。
根据您的要求,将集合公开为 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>