【发布时间】:2011-11-04 16:08:23
【问题描述】:
下面的代码(用于在 LinqPad 中运行)旨在将“foo/skip/bar”字符串解析为项目对象,跳过“跳过”位,为“foo”和“bar”生成项目对象。运行时,会产生 2 个“条形”项目。
在 TryGetChild 方法中,当找到“skip”时,将枚举数从“skip”向前移动到“bar”。但是,当执行返回到调用方法时,枚举器又回到“跳过”状态。
我认为这是一些 yield 块怪异,好像我在 Main() 中进行拆分并将枚举器传递给 Walk() 它可以正常工作。有人可以解释枚举器是如何返回的吗?是否正在创建一个新的?
edit:这是我在代码中发现的看似奇怪的情况的一个非常简化的版本。我是出于好奇而提出这个问题,而不是寻找我已经找到的解决方法。
/* 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 };
}
}
【问题讨论】:
-
您的代码是否有理由需要使用此方法?您的目标似乎可以通过更简单的方式实现。
标签: .net yield-return