c#无限层级,配置多层级菜单等

1 篇文章 0 订阅

找网上在了很久如何将一张表含无限层级的数据,分层级赋值到实体类类中,并生成JSON字符串,没有找到合适的例子。于是自己采用递归写了一个。

先看代码

private static void Demo()
{
    List<Limit> limits = new List<Limit>();
    limits.Add(new Limit { id = 1, pid = 0, name = "任务管理" });
    limits.Add(new Limit { id = 2, pid = 0, name = "任务维护" });
    limits.Add(new Limit { id = 3, pid = 1, name = "下载" });
    limits.Add(new Limit { id = 4, pid = 3, name = "下载1" });
    limits.Add(new Limit { id = 5, pid = 3, name = "下载2" });

    var dd = ToHierarchy(limits);
    string json = JsonConvert.SerializeObject(dd);
    Console.WriteLine(json);
    Console.ReadLine();
}

/// <summary>
/// 将实体类转换为层级形式
/// </summary>
/// <param name="limits"></param>
/// <param name="pid"></param>
/// <returns></returns>
public static List<Limit> ToHierarchy(List<Limit> limits, int? pid = 0)
{
    List<Limit> newLimitList = new List<Limit>();
    newLimitList = limits.Where(t => t.pid == pid).ToList();

    for (int i = 0; i < newLimitList.Count; i++)
    {
        newLimitList[i].Limits = ToHierarchy(limits, newLimitList[i].id);//下一层级
    }
    return newLimitList;
}

public class Limit
{
    public int id { get; set; }
    public int? pid { get; set; }
    public string name { get; set; }
    public List<Limit> Limits { get; set; }
}

最后的效果
在这里插入图片描述

[
  {
    "id": 1,
    "pid": 0,
    "name": "任务管理",
    "Limits": [
      {
        "id": 3,
        "pid": 1,
        "name": "下载",
        "Limits": [
          {
            "id": 4,
            "pid": 3,
            "name": "下载1",
            "Limits": []
          },
          {
            "id": 5,
            "pid": 3,
            "name": "下载2",
            "Limits": []
          }
        ]
      }
    ]
  },
  {
    "id": 2,
    "pid": 0,
    "name": "任务维护",
    "Limits": []
  }
]

方法二:采用前端js方法进行层级转换

function setTreeData(source){
    let cloneData = JSON.parse(JSON.stringify(source))      // 对源数据深度克隆
    return  cloneData.filter(father=>{                      // 循环所有项,并添加children属性
        let branchArr = cloneData.filter(child=> father.id == child.parentId);   // 返回每一项的子级数组
        branchArr.length>0 ? father.children=branchArr : ''   //给父级添加一个children属性,并赋值
        return father.parentId==0;      //返回第一层
    });
}

参考:js实现无限层级树形数据结构(创新算法)

当然对于上述的递归用法,还有很多可以拓展的地方。欢迎大家在下面留言讨论哦!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值