C# 中是否有仅允许添加项但不允许删除项的内置数据结构

本文关键字:不允许 删除 数据结构 内置 添加 是否 许添加 | 更新日期: 2023-09-27 18:32:03

我想传递一个类似数组或类似集合的结构,其他类附加到它,但绝不允许从中删除。

C# 中是否有内置的数据结构来管理这一点?

C# 中是否有仅允许添加项但不允许删除项的内置数据结构

不,您必须基于现有实现之一构建自己的接口。

C# 中是否存在只允许添加项而不允许删除项的内置数据结构?

不,没有。

但是有一个可以轻松创建自己的类 - Collection类,可以在System.Collections.ObjectModel命名空间中找到。

public class Collection<T> : IList<T>, ICollection<T>, IEnumerable<T>, 
    IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>

您所需要的只是创建一个派生类,重写一些方法并像这样抛出NotSupportedException

public class AddOnlyCollection<T> : System.Collections.ObjectModel.Collection<T>
{
    protected override void ClearItems() { throw new NotSupportedException(); }
    protected override void RemoveItem(int index) { throw new NotSupportedException(); }
    protected override void SetItem(int index, T item) { throw new NotSupportedException(); }
}

更新:正如Tseng在评论中正确提到的,上述内容不被认为是一个好的做法,因此更好的方法是定义自己的接口并使用上面的界面来轻松实现它,就像这样

public interface IAddOnlyCollection<T> : IReadOnlyCollection<T> // could be IReadOnlyList<T> if you wish
{
    void Add(T item);
}
public class AddOnlyCollection<T> :
    System.Collections.ObjectModel.Collection<T>, IAddOnlyCollection<T>
{
    // Same as above
}

更新 2:事实证明,来自同一命名空间的类 ReadOnlyCollection 是更好的选择。您所需要的只是继承它并定义Add方法。在这种情况下,不需要接口。

所以完整的最终解决方案看起来像这样

public class AddOnlyCollection<T> : ReadOnlyCollection<T>, ICollection<T>
{
    public void Add(T item) { Items.Add(item); }
}

您可以创建自己的实现 IList 的类。有关详细信息,请参阅此答案:

如何在 C# 中重写 List 的 Add 方法?。

您不能只从列表继承并覆盖删除,因为删除不是虚拟的。但是,您自己的类可能具有用于跟踪项的私有 List 变量。如果这样做,则必须实现 Delete,但 Remove 方法可能只会引发 NotSupportedException。

你必须建立自己的类,你可以利用以下内容:

  1. Array.AsReadOnly()方法。
  2. ReadOnlyCollection .