C# 中用 yield return 关键字实现获取树型数据结构的所有子节点
通常,我们在获取树形结构数据所有子节点时,需要写一个递归调用的方法,循环调用,这是数据结构算法里的通用写法。
下面介绍用 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);
}
--完--
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
· 使用TypeScript开发微信小程序(云开发)-入门篇
· 没几个人需要了解的JDK知识,我却花了3天时间研究
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 管理100个小程序-很难吗
· 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持