我手动递增枚举器并将其传递给函数来处理数据子集。从这些函数返回后,我发现枚举器没有更改父函数中的状态。
这是我正在谈论的简化版本。
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()在两个对象上都是相同的。