tree状数据叶子节点与根节点等的递归转换
做项目时经常遇到树状层级数据。从各个层级数据的转换查询等。场景如行业类别的多层级,行政区层级,检查项类别层级等等。
数据结构如 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状数据叶子节点与根节点等的递归转换的更多相关文章
- C#中treeview的问题,如何区分根节点和子节点以及根节点和根节点的兄弟节点?
根节点的Level属性为0,一级子节点Level属性为1,二级子节点Level属性为2,以此类推:同级节点可以用索引.名称.文本来区分.用索引区分根节点时,TreeView.Nodes[0]就是第一个 ...
- hdu 2545(并查集求节点到根节点的距离)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2545 思路:dist[u]表示节点u到根节点的距离,然后在查找的时候更新即可,最后判断dist[u], ...
- 【转】oracle CONNECT BY PRIOR叶子节点查找根节点
SELECT TRANS_ID FROM TRANS_INST WHERE connect_by_isleaf=1 START WITH TRANS_ID =480242 CONNECT BY PRI ...
- asp.net 实现treeview 选中父节点其子节点也选种中 选中子节点其父节点与根节点也被选中
1.在 Page_Load(object sender, EventArgs e) 里面加入: TreeView1.Attributes.Add("onclick", " ...
- 我眼中的Linux设备树(五 根节点)
五 根节点一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是"/",至少需要包含model和compatible两个属性.model属性我们 ...
- Linux设备树(五 根节点)
五 根节点 一个最简单的设备树必须包含根节点,cpus节点,memory节点.根节点的名字及全路径都是“/”,至少需要包含model和compatible两个属性.model属性我们在属性那节已经说过 ...
- ztree 获取根节点
function getRoot() { var treeObj = $.fn.zTree.getZTreeObj("tree-div"); //返回一个根节点 var node ...
- xml文件的根节点layout_width或者layout_height设置无效果的原因分析
在android开发中相信大家对ListView.GridView等组建都非常熟悉,在使用它们的时候须要自己配置相关的Adapter,而且配置现骨干的xml文件作为ListView等组建的子View, ...
- 红黑树之 原理和算法详细介绍(阿里面试-treemap使用了红黑树) 红黑树的时间复杂度是O(lgn) 高度<=2log(n+1)1、X节点左旋-将X右边的子节点变成 父节点 2、X节点右旋-将X左边的子节点变成父节点
红黑树插入删除 具体参考:红黑树原理以及插入.删除算法 附图例说明 (阿里的高德一直追着问) 或者插入的情况参考:红黑树原理以及插入.删除算法 附图例说明 红黑树与AVL树 红黑树 的时间复杂度 ...
随机推荐
- Ubuntu中eclipse端口被占
我的eclipse有时候会闪退,然后再次打开运行HTML程序的时候会提示端口被占,即使之前改过端口也会提示,然后我就在网上搜索解决办法,目前亲测有效的是 输入以下命令: lsof -i:8888 // ...
- LINUX更改桌面的分辨率
命令行 输入xrandr 输入xrandr命令后可以看到系统的一些分辨率的列表, 和当前系统屏幕的分辨率信息,可以通过命令的 相应参数对系统分辨率的一些设置操作. xrandr -s 0 全屏 xra ...
- 2017-10-22—发光二极管
LED与 LD的差别在工作原理上的差别:LED是利用注入有源区的载流子自发辐射复合发光,而LD是受激辐射复合发光.在结构上的差别:LD有光学谐振腔,使产生的光子在腔内振荡放大,LED没有谐振腔.性能上 ...
- django——CRM项目
1.引言 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销售循环 ...
- __x__(4)0905第二天__软件架构
软件架构 C/S 架构,客户端/服务器,用户通过客户端使用软件. 一般的应用软件都是 C/S 架构,如 QQ,360 等等. C 为 Client,用户电脑使用的软件. S 为 Server,服务器, ...
- vue-router 之 keep-alive
参考 https://www.jianshu.com/p/0b0222954483
- java学习之路--I/O流
java基础学习总结——流 一.JAVA流式输入/输出原理
- Jquery逐行读取txt 文件
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...
- Unity 和android 交互 记录
参考文章 http://www.jianshu.com/p/c06063a403c6 趟坑如下 icon 冲突问题: 设置不了unity icon,显示的是默认的 android 小人 解决方法: 在 ...
- 保护模式.vbs
Sub Main Dim cnt Dim delay delay = 10000 For cnt = 0 To 80 crt.screen.Send "interface optical-r ...