在集合的框架类中,我经常看到
现在假设我正在编写自己的集合类,并且内部有一个类似于
我应该编写自己的枚举器类,还是可以返回
我还有一个相关的问题。如果这并不重要或没有什么区别,为什么BCL中的每个集合类都编写了自己的
例如,
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);
}
// some logic
的意思是可以向枚举器中添加一些额外的逻辑。 - Maartenclass MyColl : IEnumerable<int>
。我可以在内部使用数组来保存我的值,因此有一个字段private int[] array;
。现在,当我需要实现泛型接口时,我不能只说return array.GetEnumerator();
(编译时错误),因为数组(这里是int[]
)不太通用。我可以通过return array.Select(x => x).GetEnumerator();
来解决这个问题。但那是浪费的。相反,使用return ((IEnumerable<int>)array).GetEnumerator();
或等效地使用return array.AsEnumerable().GetEnumerator();
。你明白我的意思吗? - Jeppe Stig NielsenIEnumerator<T>
,那么不能在调用之间检测到列表更改,这应该会引发异常。 - Jon Skeet