C# 中是否有仅允许添加项但不允许删除项的内置数据结构
本文关键字:不允许 删除 数据结构 内置 添加 是否 许添加 | 更新日期: 2023-09-27 18:32:03
我想传递一个类似数组或类似集合的结构,其他类附加到它,但绝不允许从中删除。
C# 中是否有内置的数据结构来管理这一点?
不,您必须基于现有实现之一构建自己的接口。
C# 中是否存在只允许添加项而不允许删除项的内置数据结构?
不,没有。
但是有一个可以轻松创建自己的类 - CollectionSystem.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:事实证明,来自同一命名空间的类 ReadOnlyCollectionAdd
方法。在这种情况下,不需要接口。
所以完整的最终解决方案看起来像这样
public class AddOnlyCollection<T> : ReadOnlyCollection<T>, ICollection<T>
{
public void Add(T item) { Items.Add(item); }
}
您可以创建自己的实现 IList 的类。有关详细信息,请参阅此答案:
如何在 C# 中重写 List
您不能只从列表继承并覆盖删除,因为删除不是虚拟的。但是,您自己的类可能具有用于跟踪项的私有 List 变量。如果这样做,则必须实现 Delete,但 Remove 方法可能只会引发 NotSupportedException。
你必须建立自己的类,你可以利用以下内容:
-
Array.AsReadOnly()
方法。 -
ReadOnlyCollection
.