为什么IEnumerator <t>在传递给函数后不会保留状态

时间:2017-05-25 16:45:48

标签: c# ienumerator

我手动递增枚举器并将其传递给函数来处理数据子集。从这些函数返回后,我发现枚举器没有更改父函数中的状态。

这是我正在谈论的简化版本。

class Program {
    static void Main(string[] args) {
        var input = new List<string>() {
            "1",
            "2",
            "escape",
            "3",
            "4",
            "return",
            "5"
        };

        foreach(var line in ParseFile(input)) {
            Console.WriteLine(line);
        }
        Console.ReadLine();
        Environment.Exit(Environment.ExitCode);
    }

    private static IEnumerable<string> ParseFile(List<string> input) {
        var enumerator = input.GetEnumerator();
        while (enumerator.MoveNext()) {
            if (enumerator.Current.Equals("escape")) {
                foreach (var line in DoStuff(enumerator)) {
                    yield return line;
                }
            } else {
                yield return enumerator.Current;
            }
        }
    }

    private static IEnumerable<string> DoStuff(IEnumerator<string> enumerator) {
        do {
            yield return enumerator.Current;
        } while (enumerator.MoveNext() && (!enumerator.Current.Equals("return")));
    }
}

我所看到的是,在退出DoStuff之后,enumerator.Current仍然是“转义”并且没有增加到“返回”。以下是控制台的结果:

  

1

     

2

     

逃逸

     

3

     

4

     

3

     

4

     

返回

     

5

我的问题是导致这种情况发生的原因?是否将枚举器的深层副本传递给第二个函数?如果是这样,为什么会这样? GetHashCode()在两个对象上都是相同的。

0 个答案:

没有答案