紧接上一篇,将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的更多相关文章

  1. 关于mysql中数据存储复合树形结构,查询时结果按树形结构输出

    1.主要思想:根据已有数据,规则性的造数据 select * FROM(select lId,strName,lId as lParentId,-1 as orderIdx from tbClassi ...

  2. js中把ajax获取的数据转化成树状结构(并做成多级联动效果)

    1.首先通过ajax获取数据,此处省略,直接贴出获取到的数据格式 var arr = [{ id: 1, name: "一级标题", pid: 0 }, { id: 2, name ...

  3. Oracle恢复删除数据 && connect by 树形结构查询

    1.一个表中根据以父子级别关系查询显示出来(如图) select t.* from department t CONNECT BY PRIOR t.depid=t.supdepid ; --这样也可以 ...

  4. Vue组件模板形式实现对象数组数据循环为树形结构

    数据结构为数组中包含对象--树形结构,用Vue组件的写法实现以下的效果: 树形列表,缩进显示层级,第5级数据加底色,数据样式显色,点击展开折叠数据.本文为用Vue实现方式,另有一篇为用knockout ...

  5. js把json数据转化成树形数据

    /*转化函数*/ function(data, attributes) { let resData = data; let tree = []; for(let i = 0; i < resDa ...

  6. JavaScript 将行结构数据转化为树形结构,可提供给常用的tree插件直接使用(高效转化方案)

    前台接收到的数据格式 var rows=[{ parent: 'root', id: 'DC', title: '集团' }, { parent: 'DC', id: '01', title: '上海 ...

  7. JS 将有父子关系的数组转换成树形结构数据

    将类似如下数据转换成树形的数据 [{ id: 1, name: '1', }, { id: 2, name: '1-1', parentId: 1 }, { id: 3, name: '1-1-1', ...

  8. SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪

    来源:http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html  本文主要介绍SQL Server中记录数据变更的四个方法:触发器 ...

  9. ionic中将service中异步返回的数据赋值给controller的$scope

    1.service中异步获取数据实例 angular.module('starter.services', []) .factory('Chats', function($http,$q) {//定义 ...

随机推荐

  1. nor flash之写保护

    背景 没有电池的嵌入式设备,很容易发生随机掉电.因此要让产品可靠稳定,就必须保证各种场景下的掉电安全. 例如系统更新过程随机掉电,不能导致系统无法启动.例如正常读写flash过程中掉电,最多正在传输的 ...

  2. Tensorflow内存暴涨问题

    1.目前只总结出两条 创建saver实例saver = tf.train.Saver()放在循环外面 不循环初始化变量 sess.run(tf.global_variables_initializer ...

  3. Spring--2.Spring之IOC--了解IOC容器

    IOC(容器),用来集成别的框架 1.IOC(Inversion(反转)Of Control):控制反转 控制:资源的获取方式: 主动式: BookServlet{ BookService bs=ne ...

  4. 基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇

    前提 前置文章: Github Page:<基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> Coding Page:<基于Netty和SpringBoot实现 ...

  5. 使用docker增加部署速度的一次实践

    问题: 公司给我们分配的服务器到期后不付费了,换成新服务商的服务器了.也就是说我们之前的环境需要重新搭建一次.光项目就50多个(微服务40+,其他服务不到10个),需要重新部署. 之前部署项目时,需要 ...

  6. crawler 听课笔记 碎碎念 1 初步了解各种选择器极其简单的使用

    css中 身份证  id对应# 衣服      class对应 . 图片 pyquery...as pq html= request.get(url=''.....'') doc=pq(html) d ...

  7. context:component-scan标签的诠释

    XML中配置context:component-scan时,spring会自动的扫描这个包下被这些注解标识的类@Component,@Service,@Controller,@Repository,同 ...

  8. .net mvc Bundle 自己配置

    遇到了个坑 来和大家分享一下 1.一个空的mvc项目需要引用 System.Web.Optimization 2.然后nuget添加 microsoft ASP.NET WEB OPTIMIZATIO ...

  9. [bzoj1875] [洛谷P2151] [SDOI2009] HH去散步

    Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...

  10. Linux网络文件共享服务之NFS

    一.NFS服务简介 NFS全称network file system 网络文件系统,基于内核的文件系统,有sun公司开发,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,它基于r ...