在集合的框架类中,我经常看到IEnumerator<T>
分别实现为内部类,并在GetEnumerator
方法中返回它的实例。
现在假设我正在编写自己的集合类,其内部集合如List<T>
或T[]
充当内部持有者,如下所示:
public class SpecialCollection<T> : IEnumerable<T>
{
List<T> list;
public SpecialCollection<T>()
{
}
public IEnumerator<T> GetEnumerator()
{
return list.GetEnumerator();
//or
return list.Where(x => some logic).GetEnumerator();
//or directly rely on yield keyword
yield return x; //etc
}
}
我应该编写自己的枚举器类,还是可以返回List<T>
类的枚举器?我是否应该编写自己的枚举类?
我也有一个相关的问题。如果它不是那么重要或没有太大的区别,为什么BCL中的每个集合类都写自己的IEnumerator
?
例如,List<T>
类具有类似
T[] items;
public IEnumerator<T> GetEnumerator()
{
return new List<T>.Enumerator(items);
}
答案 0 :(得分:7)
第一个问题的答案是:当收益率回报不符合您的需求时。
第二个问题的答案是:这些使用频繁的类型具有异常严格的性能要求,因此枚举器是自定义构建的。我最近写了一些文章;见:
答案 1 :(得分:2)
回答一个部分:
List<T>
有自己的枚举器实现,原因有两个:
Take
将解决此问题,代价是另一个间接级别)在这里使用可变结构has certain issues,但是当以期望的方式使用时,它避免了堆分配,通过引用的虚方法调用等。