前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 中用 yield return 关键字实现获取树型数据结构的所有子节点

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

作者头像
跟着阿笨一起玩NET
发布2018-09-19 16:56:38
2K0
发布2018-09-19 16:56:38
举报

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

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

代码语言:javascript
复制
public class TreeNodeInfo
{
    public string Name { get; set; } 
    public List<TreeNodeInfo> Children { get; set; }
}

获取所有子节点:

代码语言:javascript
复制
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 操作:

代码语言:javascript
复制
IEnumerable<TreeNodeInfo> nodes = this.GetAllChildren(this.rootNode);       
foreach (var item in nodes)
{
    Debug.WriteLine(item.Name);
}

--完--

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-06-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档