通常,我们在获取树形结构数据所有子节点时,需要写一个递归调用的方法,循环调用,这是数据结构算法里的通用写法。
下面介绍用 yield return是怎么做的。如:
public class TreeNodeInfo
{
public string Name { get; set; }
public List<TreeNodeInfo> Children { get; set; }
}
获取所有子节点:
private IEnumerable<TreeNodeInfo> GetAllChildren(TreeNodeInfo root)
{
Queue<TreeNodeInfo> queue = new Queue<TreeNodeInfo>(root.Children);
while (queue.Count > 0)
{
TreeNodeInfo node = queue.Dequeue();
yield return node;
if (node.Children != null && node.Children.Count > 0)
{
node.Children.ForEach(o =>
{
queue.Enqueue(o);
});
}
}
}
这仅仅是写法的不同,如果用递归方法,运行时会帮我们处理回调方法的堆栈。而用 yield return 我们需要自己维护循环队列。
用 yield return 的另一个好处是,当你调用 GetAllChildren 方法时,程序并没有真正的运行方法体,只有你在对返回值进行操作时,才运行方法体,这个特性在某些场景很有用。如对结果进行 foreach 操作:
IEnumerable<TreeNodeInfo> nodes = this.GetAllChildren(this.rootNode);
foreach (var item in nodes)
{
Debug.WriteLine(item.Name);
}
--完--