C# 中用 yield return 关键字实现获取树型数据结构的所有子节点

通常,我们在获取树形结构数据所有子节点时,需要写一个递归调用的方法,循环调用,这是数据结构算法里的通用写法。

下面介绍用 yield return是怎么做的。如:

public class TreeNodeInfo

{

    public string Name { getset; } 

    public List<TreeNodeInfo> Children { getset; }

}

 

获取所有子节点:

private IEnumerable<TreeNodeInfo> GetAllChildren(TreeNodeInfo root)

{

    Queue<TreeNodeInfoqueue = 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);

}

 

--完--

posted on 2012-06-13 21:54  Hunter.Wei  阅读(1449)  评论(2编辑  收藏  举报