当前位置:  开发笔记 > 编程语言 > 正文

使用迭代器编写自定义IEnumerator <T>

如何解决《使用迭代器编写自定义IEnumerator<T>》经验,为你挑选了1个好方法。



1> Marc Gravell..:

你为什么要写一个迭代器类?迭代器块的重点是你不必......

public IEnumerator GetEnumerator() {
    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

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有