【发布时间】:2011-11-25 08:47:15
【问题描述】:
这很可能是用户错误(我有点希望如此)。我在 C# 中遇到了一个奇怪的情况,如果我尝试在使用 yield 的方法中进行递归调用,它似乎不受尊重(即调用被忽略)。
以下程序说明了这一点:
// node in an n-ary tree
class Node
{
public string Name { get; set; }
public List<Node> ChildNodes { get; set; }
}
class Program
{
// walk tree returning all names
static IEnumerable<string> GetAllNames(IEnumerable<Node> nodes)
{
foreach (var node in nodes)
{
if (node.ChildNodes != null)
{
Console.WriteLine("[Debug] entering recursive case");
// recursive case, yield all child node names
GetAllNames(node.ChildNodes);
}
// yield current name
yield return node.Name;
}
}
static void Main(string[] args)
{
// initalize tree structure
var tree = new List<Node>
{
new Node()
{
Name = "One",
ChildNodes = new List<Node>()
{
new Node() {Name = "Two"},
new Node() {Name = "Three"},
new Node() {Name = "Four"},
}
},
new Node() {Name = "Five"}
};
// try and get all names
var names = GetAllNames(tree);
Console.WriteLine(names.Count());
// prints 2, I would expect it to print 5
}
}
【问题讨论】: