以下のコードは、「スキップ」ビットをスキップしてアイテムオブジェクトに「foo/skip/bar」文字列を解析するためのものです。 "foo"と "bar"の項目オブジェクト。実行すると、2つの "棒グラフ"項目が生成されます。 TryGetChild法で .NET IEnumerator <string> yieldブロック内にMoveNextが進まない
、「スキップ」発見されたが、列挙子は前方に「バー」に「スキップ」から移動されます。ただし、実行が呼び出し元のメソッドに戻ると、列挙子は「スキップ」に戻ります。は私がメインで分割を行う()、それが正常に動作します)(ウォークに列挙子を渡すかのように、これは、いくつかの歩留まりブロックおかしなことだと思います。誰かが列挙者がどのように戻ってくるのか説明できますか?新しいものが作成されていますか?
編集:これは私が私のコードで発見した、一見奇妙な状況の非常に単純化したバージョンです。私は、すでに見つかった回避策を探すのではなく、この疑問を尋ねています。
/* 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