C# 把带有父子关系的数据转化为------树形结构的数据 ,以及 找出父子级关系的数据中里面的根数据Id
紧接上一篇,将List<Menu>的扁平结构数据, 转换成树形结构的数据 返回给前端 , 废话不多说,开撸!
---------------------
步骤:
1. 建 Menu实体结构
public class Menu
{
/// <summary>
/// ID
/// </summary>
public int ID { get; set; }
/// <summary>
/// 菜单名
/// </summary>
public string MenuName { get; set; }
/// <summary>
/// 父菜单
/// </summary>
public int ParentID { get; set; }
}
2. 建Tree 的数据结构(用来做树形结构的数据返回)
public class Tree
{
/// <summary>
/// ID
/// </summary>
public int ID { get; set; }
/// <summary>
/// 菜单名
/// </summary>
public string MenuName { get; set; }
/// <summary>
/// 父菜单
/// </summary>
public int ParentID { get; set; } /// <summary>
/// 子节点集合
/// </summary>
public List<Tree> Children { get; set; }
}
3. 写方法,递归遍历,将Menu实体值赋值给Tree
//根据父节点获取子节点
public static List<Tree> GetChildTree(List<Menu> list, int Id)
{ List<Tree> tree = new List<Tree>();
List<Menu> ChildList = GetChildList(list, Id);
foreach (var item in ChildList)
{
Tree treeB = new Tree();
treeB.ID = item.ID;
treeB.MenuName = item.MenuName;
treeB.Children = GetChildTree(list,item.ID);
tree.Add(treeB);
}
return tree;
} public static List<Menu> GetChildList(List<Menu> list,int Id)
{
var childList = list.Where(x => x.ParentID == Id).ToList();
return childList;
}
4. 准备数据,方法调用
// 准备要处理的数据
List<Menu> listB = new List<Menu>();
listB.Add(new Menu { ID = , MenuName = "菜单1", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.1", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.1.1", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.1.2", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.2", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.2.2", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单2", ParentID = }); var result = GetChildTree(listB, );
string jsonB = new JavaScriptSerializer().Serialize(result);
5. 转换后的树形结构数据结果图示
-----------------------开发过程中遇到的问题---------------------------------
从别人的博客看到这种方式,很高兴,以为改改,很快就可以实现工作中的功能,结果发现还欠缺点东西,就是要传入的父节点Id值给定的是0 ,写死的。
而我要传入的这个Id值要是动态的,要根据传入的List集合,找出这个集合数据里面的根节点的Id值。 在这上面的代码中并没有给出, 于是我开始折腾,最终从别人的js 代码中找到了别人的解决思路。
我的解决方法如下,希望也能够帮助一些人:
// 准备要处理的数据
List<Menu> listB = new List<Menu>();
listB.Add(new Menu { ID = , MenuName = "菜单1", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.1", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.1.1", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.1.2", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.2", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单1.2.2", ParentID = });
listB.Add(new Menu { ID = , MenuName = "菜单2", ParentID = });
//找出集合里面的根节点的Id
HashSet<int> parentIds = new HashSet<int>();
HashSet<int> childIds = new HashSet<int>();
foreach (var item in listB)
{
childIds.Add(item.ID);
parentIds.Add(item.ParentID);
}
parentIds.ExceptWith(childIds);
int rootId = parentIds.First(); var result = GetChildTree(listB, rootId);
最后,发表一下感慨,C# 写的代码真的少,7、8行就解决了!
C# 把带有父子关系的数据转化为------树形结构的数据 ,以及 找出父子级关系的数据中里面的根数据Id的更多相关文章
- 关于mysql中数据存储复合树形结构,查询时结果按树形结构输出
1.主要思想:根据已有数据,规则性的造数据 select * FROM(select lId,strName,lId as lParentId,-1 as orderIdx from tbClassi ...
- js中把ajax获取的数据转化成树状结构(并做成多级联动效果)
1.首先通过ajax获取数据,此处省略,直接贴出获取到的数据格式 var arr = [{ id: 1, name: "一级标题", pid: 0 }, { id: 2, name ...
- Oracle恢复删除数据 && connect by 树形结构查询
1.一个表中根据以父子级别关系查询显示出来(如图) select t.* from department t CONNECT BY PRIOR t.depid=t.supdepid ; --这样也可以 ...
- Vue组件模板形式实现对象数组数据循环为树形结构
数据结构为数组中包含对象--树形结构,用Vue组件的写法实现以下的效果: 树形列表,缩进显示层级,第5级数据加底色,数据样式显色,点击展开折叠数据.本文为用Vue实现方式,另有一篇为用knockout ...
- js把json数据转化成树形数据
/*转化函数*/ function(data, attributes) { let resData = data; let tree = []; for(let i = 0; i < resDa ...
- JavaScript 将行结构数据转化为树形结构,可提供给常用的tree插件直接使用(高效转化方案)
前台接收到的数据格式 var rows=[{ parent: 'root', id: 'DC', title: '集团' }, { parent: 'DC', id: '01', title: '上海 ...
- JS 将有父子关系的数组转换成树形结构数据
将类似如下数据转换成树形的数据 [{ id: 1, name: '1', }, { id: 2, name: '1-1', parentId: 1 }, { id: 3, name: '1-1-1', ...
- SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪
来源:http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html 本文主要介绍SQL Server中记录数据变更的四个方法:触发器 ...
- ionic中将service中异步返回的数据赋值给controller的$scope
1.service中异步获取数据实例 angular.module('starter.services', []) .factory('Chats', function($http,$q) {//定义 ...
随机推荐
- 利用cuteftp上传并修改网站上内容
1.下载cuteftp 2.在host中输入网址(如:219.142.121.2) 3.username中输入(如:BNULS) 4.passpord中输入:(如410teamgood) 5.端口输入 ...
- AcWing 220. 最大公约数 | 欧拉函数
传送门 题目描述 给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对. GCD(x,y)即求x,y的最大公约数. 输入格式 输入一个整数N 输出格式 输出一个 ...
- Qt中设置窗口图标
转:https://blog.csdn.net/weiren2006/article/details/7438028 1.通过qtcreator新建一个文件filename.qrc,将图片添加到fil ...
- Qt5学习(2)
1.学习了qt quick application 这是一种跟application不同的设计方式.主要就是靠“拖拖拽拽”,然后设置属性(颜色,大小),布局(margins等),然后要注意控件的从属关 ...
- 小白学Java:包装类
目录 小白学Java:包装类 包装类的继承关系 创建包装类实例 自动装箱与拆箱 自动装箱 自动拆箱 包装类型的比较 "=="比较 equals比较 自动装箱与拆箱引发的弊端 自动装 ...
- C#调用Matlab生成的Dll
问题描述:最近开发需要调用matlab生成的DLL,在New MWNumericArray 对象的时候报错,提示未将对象引用到对象的实例. 问题分析:因为MWArray.dll是Matlab提供的DL ...
- python利用sift和surf进行图像配准
1.SIFT特征点和特征描述提取(注意opencv版本) 高斯金字塔:O组L层不同尺度的图像(每一组中各层尺寸相同,高斯函数的参数不同,不同组尺寸递减2倍) 特征点定位:极值点 特征点描述:根据不同b ...
- 唬人的Java泛型并不难
泛型 public interface Foo<E> {}public interface Bar<T> {}public interface Zar<?> {} ...
- NTT - 牛客
链接:https://www.nowcoder.com/acm/contest/133/D来源:牛客网 题目描述 Applese打开了m个QQ群,向群友们发出了组队的邀请.作为网红选手,Applese ...
- bfs + 路径输出
You are given two pots, having the volume of A and B liters respectively. The following operations c ...