使用其他集合实现集合

时间:2012-02-13 01:28:12

标签: c# .net collections

通常,您必须实现一个集合,因为它不存在于.NET Framework中。在我在网上找到的示例中,新集合通常是基于另一个集合(例如,List<T>)构建的:这样就可以避免管理集合的大小调整。

public class CustomCollection<T>
{
    private List<T> _baseArray;

    ...

    public CustomCollection(...)
    {
        this._baseArray = new List<T>(...);
    }
}
  1. 遵循这种方法有哪些缺点?只是因为方法调用基本集合而降低了性能?或者编译器执行一些优化?
  2. 此外,在某些情况下,与基本集合相关的字段(例如上面的_baseArray)被声明为readonly。为什么?

3 个答案:

答案 0 :(得分:3)

  1. 主要的缺点是,如果你想玩得很好,你必须手工实现很多接口(ICollection,IEnumerable,可能是IList ......通用和非通用),这是一个很好的一点代码。不是复杂的代码,因为你只是转发呼叫,但仍然是代码。在大多数情况下,对内部列表的额外调用不应该产生太大的差异。
  2. 强制执行以下事实:一旦设置了内部列表,就无法将其更改为另一个列表。
  3. 通常最好从众多内置集合类中的一个继承来创建自己的集合,而不是艰难地进行。 Collection<T>是一个很好的起点,没有人阻止你继承List<T>本身。

答案 1 :(得分:2)

对于#2:如果私有成员仅在构造函数中分配或在声明时,它可以是readonly。如果您只有一个基础集合并且不需要重新创建它,通常就是这样。

答案 2 :(得分:-1)

我认为这种方法的一个很大的缺点是你不能在自定义集合上使用LINQ,除非你实现IEnumerable。更好的方法可能是根据需要对方法进行子类化和强制实施,例如:

public class FooList<T> : List<T>
{
    public new void Add(T item)
    {
        // any FooList-specific logic regarding adding items
        base.Add(item);
    }
}

对于readonly关键字,这意味着您只能在构造函数中设置变量。