C#中是否有内置数据结构,只允许添加项目但不删除项目?

时间:2016-01-26 18:04:32

标签: c#

我想传递一个类似于数组或类似于set的结构,其他类附加到它上面但永远不允许从中删除。

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

4 个答案:

答案 0 :(得分:1)

不,您必须根据现有实现之一构建自己的界面。

答案 1 :(得分:1)

  

C#中是否有内置数据结构,只允许添加项目但不删除项目?

不,没有。

但是有一个很容易让你创建自己的Collection<T>类,它可以在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<T>甚至是更好的选择。您所需要的只是继承它并定义Add方法。在这种情况下,不需要任何界面。

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

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

答案 2 :(得分:0)

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

How do I override List<T>'s Add method in C#?

您不能只从List继承并覆盖Remove,因为Remove不是虚拟的。但是您自己的类可以有一个用于跟踪项目的私有List变量。如果执行此操作,则必须实现Remove,但Remove方法可能只会抛出NotSupportedException。

答案 3 :(得分:0)

您必须构建自己的类,并且可以使用以下内容:

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