下面的代碼(用於在LinqPad中運行)旨在將「foo/skip/bar」字符串解析爲項目對象,跳過「skip」位,產生用於「foo」和「bar」的項目對象。運行時,會生成2個「酒吧」項目。.NET IEnumerator <string>當在yield塊中時不會在MoveNext上前進
在TryGetChild方法中,當找到「skip」時,枚舉器從「skip」向前移動到「bar」。但是,當執行返回到調用方法時,枚舉器又回到「跳過」。
我認爲這是一些產量塊怪異,就好像我在Main()中進行拆分並將枚舉器傳遞到Walk()它可以正常工作。有人可以解釋一下統計員如何返回?是否正在創建一個新的?
編輯:這是我在我的代碼中發現的似乎很奇怪的情況的一個非常簡化的版本。我出於好奇問這個問題,而不是尋找我已經找到的解決方法。
/* output from program
enumerator moved to foo
enumerator moved to skip
enumerator moved to bar
enumerator moved to bar
Item [] (3 items)
foo
bar
bar
*/
static void Main()
{
Walk("foo/skip/bar").ToArray().Dump();
}
private static IEnumerable<Item> Walk(string pathString)
{
var enumerator = pathString.Split('/').ToList().GetEnumerator();
var current = new Item() { S = "" };
while (enumerator.MoveNext())
{
Console.WriteLine("enumerator moved to " + enumerator.Current);
yield return current.TryGetChild(enumerator);
}
}
class Item
{
public string S { get; set; }
public Item TryGetChild(IEnumerator<string> enumerator)
{
if (enumerator.Current == "skip")
{
enumerator.MoveNext(); //iterator moves on to 123
Console.WriteLine("enumerator moved to " + enumerator.Current);
}
return new Item() { S = enumerator.Current };
}
}
你的代碼需要使用這種方法的原因是什麼?看起來你的目標可以以更簡單的方式實現。 – dlev
@dlev:看到編輯 – mcintyre321