欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

无限级递归算法(使用多种层级数据)

程序员文章站 2022-05-30 23:25:58
...

1.首先数据结构必须是这样的,数据架构中带上parentId 才可以实现层级查询。

也可以把父级iD 改为子级ID 也就是 下一级的ID 但是 子级数据多的话数据会有缺陷,可以根据自己的需求来调整;

public class Menu {
  // 菜单id
  private String id;
  // 菜单名称
  private String name;
  // 父菜单id
  private String parentId;
  // 菜单url
  private String url;
  // 菜单图标
  private String icon;
  // 菜单顺序
  private int order;
  // 子菜单
  private List<Menu> children;
  // ... 省去getter和setter方法以及toString方法
}

2.首先 书写,准备调用层级递归的函数,

 /// <summary>
        /// 根据userid获取用户的分享层级人数  递归 方法一
        /// </summary>
        /// <returns></returns>
        public string GetUsershares()
        {
        //查询出来所有的分享数据。
            var list = caseInteractionService.UsershareList().Select(n=> new UsershareView { uid=n.uid,pid=n.pid,caseid=n.caseid,ID=n.ID}).ToList();
          

            //查询出来所有的根目录级的分享数据。
            var lis= caseInteractionService.UsershareList().Where(n=>n.pid=="0").Select(n => new UsershareView { uid = n.uid, pid = n.pid, caseid = n.caseid, ID = n.ID }).ToList();
            //循环所有根目录的分享数据,调用递归,去查询所有根目录下的子级分享数据(递归也是通过父级ID去定位查询的)
            foreach (var item in lis)
            {
            //查询出来的子级集合,赋值给当前对象的子级集合属性中。
             List<UsershareView> childList =  getChild(item.ID.ToString(), list);
                item.children = childList;
            }
         
            var result1 = JsonConvert.SerializeObject(lis);
            return result1;
        }
  1. 查询子级递归方法
 /// <summary>
        /// 获取子节点
        /// </summary>
        /// <param name="id"></param>
        /// <param name="allMenu"></param>
        /// <returns></returns>
        public List<UsershareView> getChild(string id, List<UsershareView> allMenu)
        {
            //子菜单
            List<UsershareView> childList = new List<UsershareView>();
            foreach (var item in allMenu)
            {
                if (item.pid.Equals(id))
                {
                    // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
                    //相等说明:为该根节点的子节点。
                    childList.Add(item);
                }
            }
            //递归
            foreach (var obj in childList)
            {
                obj.children = getChild(obj.ID.ToString(), allMenu);
            }

           
            
            if (childList.Count() == 0)
            {
                return new List<UsershareView>();
            }
            return childList;
        }
相关标签: SQL Server c#