做项目时经常遇到树状层级数据。从各个层级数据的转换查询等。场景如行业类别的多层级,行政区层级,检查项类别层级等等。

数据结构如  Id Name ParentId

 #region area树状节点的转化

        public List<Area> ConvertToLeafChildAreas(List<int> areaIds)
{
var allAreas = GetNewAreas().ToList();
List<Area> leafChildren = new List<Area>();
foreach (var areaId in areaIds)
{
leafChildren.AddRange(GetLeafChildAreas(areaId, allAreas));
}
return leafChildren;
} /// <summary>
/// 根据父ID获取所有的最小地区
/// </summary>
/// <param name="parentId"></param>
/// <param name="allAreas"></param>
/// <returns></returns>
public List<Area> GetLeafChildAreas(int parentId,List<Area> allAreas)
{
List<Area> leafChildren = new List<Area>();
var sons = allAreas.Where(o => o.ParentId == parentId).ToList();
if (sons.Any())
{
foreach (var item in sons)
{
leafChildren.AddRange(GetLeafChildAreas(item.Id, allAreas));
}
}
else
{
var currentArea = allAreas.FirstOrDefault(m=>m.Id== parentId);
leafChildren.Add(currentArea);
}
return leafChildren;
} public List<Area> ConvertToRootAreas(List<int> childAreaIds)
{
var allAreas = GetNewAreas().ToList();
var childAreas = allAreas.Where(m => childAreaIds.Contains(m.Id)).ToList();
List<Area> root = new List<Area>();
foreach (var childArea in childAreas)
{
root.Add(GetRootArea(childArea, allAreas));
}
return root.Distinct().ToList();
}
/// <summary>
/// 根据子ID获取所有的最顶级地区
/// </summary>
/// <param name="childArea"></param>
/// <param name="allAreas"></param>
/// <returns></returns>
public Area GetRootArea(Area childArea, List<Area> allAreas)
{
var parentArea = allAreas.FirstOrDefault(o => o.Id == childArea.ParentId);
if (parentArea==null) return childArea;
return GetRootArea(parentArea,allAreas);
}
#endregion

  

tree状数据叶子节点与根节点等的递归转换的更多相关文章

  1. C#中treeview的问题,如何区分根节点和子节点以及根节点和根节点的兄弟节点?

    根节点的Level属性为0,一级子节点Level属性为1,二级子节点Level属性为2,以此类推:同级节点可以用索引.名称.文本来区分.用索引区分根节点时,TreeView.Nodes[0]就是第一个 ...

  2. hdu 2545(并查集求节点到根节点的距离)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2545 思路:dist[u]表示节点u到根节点的距离,然后在查找的时候更新即可,最后判断dist[u], ...

  3. 【转】oracle CONNECT BY PRIOR叶子节点查找根节点

    SELECT TRANS_ID FROM TRANS_INST WHERE connect_by_isleaf=1 START WITH TRANS_ID =480242 CONNECT BY PRI ...

  4. asp.net 实现treeview 选中父节点其子节点也选种中 选中子节点其父节点与根节点也被选中

    1.在 Page_Load(object sender, EventArgs e) 里面加入: TreeView1.Attributes.Add("onclick", " ...

  5. 我眼中的Linux设备树(五 根节点)

    五 根节点一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是"/",至少需要包含model和compatible两个属性.model属性我们 ...

  6. Linux设备树(五 根节点)

    五 根节点 一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是“/”,至少需要包含model和compatible两个属性.model属性我们在属性那节已经说过 ...

  7. ztree 获取根节点

    function getRoot() { var treeObj = $.fn.zTree.getZTreeObj("tree-div"); //返回一个根节点 var node ...

  8. xml文件的根节点layout_width或者layout_height设置无效果的原因分析

    在android开发中相信大家对ListView.GridView等组建都非常熟悉,在使用它们的时候须要自己配置相关的Adapter,而且配置现骨干的xml文件作为ListView等组建的子View, ...

  9. 红黑树之 原理和算法详细介绍(阿里面试-treemap使用了红黑树) 红黑树的时间复杂度是O(lgn) 高度<=2log(n+1)1、X节点左旋-将X右边的子节点变成 父节点 2、X节点右旋-将X左边的子节点变成父节点

    红黑树插入删除 具体参考:红黑树原理以及插入.删除算法 附图例说明   (阿里的高德一直追着问) 或者插入的情况参考:红黑树原理以及插入.删除算法 附图例说明 红黑树与AVL树 红黑树 的时间复杂度 ...

随机推荐

  1. 一、自动化平台搭建-python虚拟环境安装

    主要知识点介绍: 安装django环境 创建django项目 设计模型类并利用模型类和数据库进行交互 使用django后台管理数据 编写视图函数,进行URL配置 模板的使用 图书-英雄案例完成 1.虚 ...

  2. Elasticsearch大规模时序索引如何治理和规划

    什么是时序索引? 其主要特点体现在两个方面, 一存,以时间为轴,数据只有增加,没有变更,并且必须包含timestamp(日期时间,名称随意)字段,其作用和意义要大于数据的id字段,常见的数据比如我们通 ...

  3. Spring异步调用原理及SpringAop拦截器链原理

    一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTI ...

  4. (二)文档请求不同源之window.name跨域

    一.基本原理 window.name不是一个普通的全局变量,而是当前窗口的名字.这里要注意的是每个iframe都有包裹它的window,而这个window 是top window的子窗口,而它自然也有 ...

  5. Spring Cloud微服务笔记(一)微服务概念

    微服务概念 一.什么是微服务架构 微服务,是一个小的.松耦合的分布式服务. 为什么需要微服务: 1)单体系统部署在一个进程中,修改了一个小功能,为了部署上线就会影响其他功能. 2)单体应用各个功能模块 ...

  6. Selenium爬取电影网页写成csv文件

    绪论 首先写这个文章的时候仅仅花了2个晚上(我是菜鸟所以很慢),自己之前略懂selenium,但是不是很懂csv,这次相当于练手了. 第一章 环境介绍 具体实验环境 系统 Windows10教育版 1 ...

  7. JavaScript(六)

    定时器 定时器在javascript中的作用1.制作动画2.异步操作3.函数缓冲与节流 定时器类型及语法 /* 定时器: setTimeout 只执行一次的定时器 clearTimeout 关闭只执行 ...

  8. python学习:删除空白

    删除空白   删除尾部空白 确保字符串尾部没有空白,使用rstrip(); 删除字符串开头的空白,使用lstrip(); 同时删除字符串两端的空白,使用strip() 代码: >>> ...

  9. 201771010126.王燕《面向对象程序设计(Java)》第六周学习总结

    实验六 继承定义与使用 实验时间 2018-9-28 1.实验目的与要求 (1) 理解继承的定义: 继承就是用已有类来构建新类的一种机制,当你继承了一个类时,就继承了这个类的方法和字段,同时你也可以在 ...

  10. vue组件创建学习总结

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...