你为什么要写一个迭代器类?迭代器块的重点是你不必......
即
public IEnumeratorGetEnumerator() { int position = 0; // state while(whatever) { position++; yield return ...something...; } }
如果你添加更多的上下文(即,为什么以上不能工作),我们可能会提供更多帮助.
但是如果可能的话,避免编写迭代器类.他们工作很多,容易出错.
顺便说一下,你真的不必费心Reset
- 它在很大程度上已被弃用,并且不应该被使用(因为它不能依赖于任意枚举器).
如果你想使用内部迭代器,那也没关系:
int position = 0; foreach(var item in source) { position++; yield return position; }
或者如果您只有一个枚举器:
while(iter.MoveNext()) { position++; yield return iter.Current; }
您也可以考虑将状态(作为元组)添加到您收益的事物中:
class MyState{ public int Position {get;private set;} public T Current {get;private set;} public MyState(int position, T current) {...} // assign } ... yield return new MyState (position, item);
最后,您可以使用LINQ样式的扩展/委托方法,Action
并为调用者提供位置和值:
static void Main() { var values = new[] { "a", "b", "c" }; values.ForEach((pos, s) => Console.WriteLine("{0}: {1}", pos, s)); } static void ForEach( this IEnumerable source, Action action) { if (source == null) throw new ArgumentNullException("source"); if (action == null) throw new ArgumentNullException("action"); int position = 0; foreach (T item in source) { action(position++, item); } }
输出:
0: a 1: b 2: c