随笔 - 8  文章 - 0  评论 - 54  阅读 - 20185

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

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

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

public class TreeNodeInfo

{

    public string Name { getset; } 

    public List<TreeNodeInfoChildren { 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   Hunter.Wei  阅读(1463)  评论(2)    收藏  举报
编辑推荐:
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
阅读排行:
· 使用TypeScript开发微信小程序(云开发)-入门篇
· 没几个人需要了解的JDK知识,我却花了3天时间研究
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 管理100个小程序-很难吗
· 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持
< 2012年6月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
1 2 3 4 5 6 7

点击右上角即可分享
微信分享提示