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树 红黑树 的时间复杂度 ...
随机推荐
- Classy Numbers
http://codeforces.com/group/w1oiqifZbS/contest/1036/problem/C ①先查找,存入vector(dfs)-->排序(sort)--> ...
- GA:利用GA对一元函数进行优化过程,求x∈(0,10)中y的最大值——Jason niu
x = 0:0.01:10; y = x + 10*sin(5*x)+7*cos(4*x); figure plot(x, y) xlabel('independent variable') ylab ...
- Django & JavaScript 用Ajax实现JSON数据的请求和响应
[描述] 1.Server端定义了两个字段:Article.title 和 Article.content 2.客户端用JavaScript Ajax异步加载请求服务器的JSON数据 效果是点击按钮从 ...
- 译:Dataiku 白皮书之《在银行和保险行业应用数据科学》
原文链接:Data Science For Banking & Insurance 如果不能正常访问,请点击备份获取. 在银行和保险行业应用数据科学 互联网巨头和金融技术创业时代的求生和发展 ...
- 机器学习入门之python实现图片简单分类
小任务:实现图片分类 1.图片素材 python批量压缩jpg图片: PIL库 resize http://blog.csdn.net/u012234115/article/details/50248 ...
- CSS3 三次贝塞尔曲线(cubic-bezier)
例子:transition:all 1s cubic-bezier(.21,.2,.65,.1) 最近在看animation模块,其中animation-timing-function 和 trans ...
- [LeetCode] Reaching Points 到达指定点
A move consists of taking a point (x, y) and transforming it to either (x, x+y) or (x+y, y). Given a ...
- 传统方式和插件方式 分别实现 分页 功能 pageHelper 插件
实现分页 这里提供两种方式 一种是传统的分页方式 一种是基于pageHelper插件 实现的分类 推荐使用后者 前者是一般开发的方式 思路 先手动创建一个 pageUtil 工具 ...
- App测试方法总结
安全测试 一.安全测试 1.软件权限 1)扣费风险:包括短信.拨打电话.连接网络等. 2)隐私泄露风险:包括访问手机信息.访问联系人信息等. 3)对App的输入有效性校验.认证.授权.数据加密等方 ...
- oracle统计数据时,涉及两个表的数据
SELECT t1.*,a.num FROM (SELECT SUM(t.total_profit) total_profit, SUM(t.main_business_income) main_bu ...