是否有一组 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 的实现(仅只读)。

是否有一组 C# 数据只读泛型集合/数据结构

如果你想要不可变的集合,而不仅仅是只读的集合,你可能会对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);
    }
}

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

你应该看看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>