紧接上一篇,将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行就解决了!

最新文章

  1. 使用Fragment的两种方式:&lt;fragment&gt;与&lt;FrameLayout&gt;
  2. jQuery Tocify 定位导航
  3. atitit. 统计功能框架的最佳实践(1)---- on hibernate criteria
  4. JAVA笔记 之 Thread线程
  5. iOS开发中的错误整理,关于用绑定Tag取控件的注意事项,有时候不绑定也是个错!
  6. Function对象属性和方法
  7. (菜鸟要飞系列)三,基于Asp.Net MVC5的后台管理系统(用户的增删改查功能)
  8. Burp Suite教程(英文版)
  9. [学习笔记]设计模式之Proxy
  10. nginx 引入外部文件
  11. kubernetes进阶之七:Service
  12. Linux下Apache的安装【可用】
  13. navicat远程连接阿里云ECS上的MYSQL报Lost connection to MySQL server at &#39;reading initial communication packet&#39;
  14. VS2012 编译报错:找不到编译动态表达式所需的一个或多个类型。是否缺少引用?
  15. EntityFramework安装和EF升级方法
  16. 疯狂java讲义 第三版 笔记
  17. HDU2612(KB1-N)
  18. [Node.js] Stream all things!
  19. opencrud graphql 数据操作指南
  20. MySQL学习之路(一)——初涉MySQL。

热门文章

  1. JavaScript中函数式编程中文翻译
  2. Java面向对象之异常详解
  3. JWT(二):使用 Java 实现 JWT
  4. C# 调用R语言
  5. Django-视图&amp;网址
  6. Java8 新特性(三) - 日期时间对象以及一些其他特性
  7. python小知识点总结
  8. 异数OS-星星之火(二)--远程实验室注册开放
  9. StampedLock的理解和使用
  10. 【javaScript】js出现allocation size overflow以及字符串拼接优化