C# 一次循环获取树的两种方法

简介: C# 一次循环获取树的两种方法

第一种方法好些


第二种方法如果中间断开就会成为一级


 private static List<Menu> MenuTree()
        {
            var menu1 = new Menu { Id = 1, ParentId = 0, Name = "aaa" };
            var menu2 = new Menu { Id = 2, ParentId = 0, Name = "bbb" };
            var menu3 = new Menu { Id = 3, ParentId = 0, Name = "ccc" };
            var menu4 = new Menu { Id = 4, ParentId = 1, Name = "ddd" };
            var menu5 = new Menu { Id = 5, ParentId = 2, Name = "eee" };
            var menu6 = new Menu { Id = 6, ParentId = 4, Name = "fff" };
            var menu7 = new Menu { Id = 7, ParentId = 5, Name = "ggg" };
            var menu8 = new Menu { Id = 8, ParentId = 6, Name = "hhh" };
            var menuAll = new List<Menu> { menu1, menu2, menu3, menu4, menu5, menu6, menu7, menu8 };
            var menuList = new List<Menu> { menu1, menu2, menu3, menu4, menu5, menu7, menu8 };
          //第一种方法
            while (true)
            {
                var idList = menuList.Select(x => x.Id).ToList();
                idList.AddRange(menuList.Select(x => x.ParentId).ToList());
                idList = idList.Distinct().ToList();
                var menus = menuAll.Where(x => idList.Contains(x.Id)).ToList();
                if (menus.Count != menuList.Count)
                {
                    menuList = menus;
                    continue;
                }
                break;
            }
       //第二种方法 
            var ret = new List<Menu>();
            foreach (var menu in menuList)
            {
                var model = menuList.FirstOrDefault(x => x.Id == menu.ParentId);
                if (model == null)
                {
                    ret.Add(menu);
                    continue;
                }
                model.Children.Add(menu);
            }
            return ret;
        }

 

相关文章
|
7月前
|
存储 安全 算法
基于 C# Trie 树的'管控员工上网 URL 过滤与匹配优化方案探索
本文探讨了 Trie 树在员工上网管控中的应用,分析其在 URL 实时过滤中的高效性,包括前缀匹配、存储优化和动态更新等优势,并提供 C# 实现方案,助力企业提升网络管理效率。
159 0
|
5月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
286 4
|
8月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
210 2
|
安全 编译器 程序员
C# 中 foreach 循环和 for 循环深度比较
为什么建议你多数情况下使用 foreach 进行遍历循环?看完你就明白了
450 5
|
10月前
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
217 7
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
686 3
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
622 2
|
Java C#
如何避免在C#循环中使用await
如何避免在C#循环中使用await
399 9
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
493 1
|
C#
C#的方法的参数传递
C#的方法的参数传递
243 0