正向递归和反向递归

来源:互联网 发布:个人编程兼职 编辑:程序博客网 时间:2024/04/20 00:06

有啥补充请大神们在下面留言:



//反向递归   找到最低层的菜单一步步往上查    (先逆向递归然后再反向递归)


  [HttpPost]

        public ReturnNode MenuListByAdd(GetMenuListInput input)
        {
            /////反向递归,从最底层menu找上面所有的menu
            var allList = dbContext.yf_menu.AsQueryable().ToList();
            string sql = "select * from  yf_menu as d where  d.Id  in(select menuid from yf_action as c where c.id in(select a.actionid from  yf_role_action as a where a.roleid = 2) GROUP BY  menuid); ";
            var bottomList = dbContext.Database.SqlQuery<yf_menu>(sql).ToList();
            List<yf_menu> newList = new List<yf_menu>();
            foreach (yf_menu node in bottomList)
            {
                newList.Add(node);
                newList.AddRange(GetParentMenuList(node, allList));
            }
            var list = newList.Where((x, i) => newList.FindIndex(z => z.id == x.id) == i);//数组去重


            ///************************
            string actionSql = string.Format("SELECT a.*,r.roleid from yf_action a LEFT JOIN yf_role_action r on  a.id=r.actionid and r.roleid={0}", input.roleId);
            var actionList = dbContext.Database.SqlQuery<GetMenuListActionOutput>(actionSql).ToList();
            var newlist = new List<GetMenuListOutput>();
            foreach (yf_menu menu in list)
            {
                GetMenuListOutput newinput = new GetMenuListOutput();
                newinput.createtime = menu.createtime;
                newinput.id = menu.id;
                newinput.menuname = menu.menuname;
                newinput.menuurl = menu.menuurl;
                newinput.note = menu.note;
                newinput.parentid = menu.parentid;
                newinput.actionList = actionList.Where(u => u.menuid == menu.id).OrderBy(p => p.id).ToList();
                newlist.Add(newinput);
            }
            if (input.outDataType == 1)//树形
            {
                GetMenuListOutput tree = initMenuTree(newlist.Where(u => u.parentid == 0).FirstOrDefault(), newlist);
                return ReturnNode.ReturnSuccess(tree);
            }
            else if (input.outDataType == 2)//数据字典
            {
                return ReturnNode.ReturnSuccess(newlist.ToDictionary(u => u.id));
            }
            else//数组
            {
                return ReturnNode.ReturnSuccess(newlist);
            }

        }


//递归找上级方法


   //递归找上级
        private List<yf_menu> GetParentMenuList(yf_menu menuNode, List<yf_menu> allList)
        {
            yf_menu parentNode = allList.Where(u => u.id == menuNode.parentid).FirstOrDefault();
            List<yf_menu> newList = new List<yf_menu>();
            newList.Add(parentNode);
            if (parentNode.parentid != 0)
            {
                newList.AddRange(GetParentMenuList(parentNode, allList));
            }
            return newList;
        }







==========正向递归



 //生成树
        private GetMenuListOutput initMenuTree(GetMenuListOutput menu, List<GetMenuListOutput> list)
        {
            var chirldens = list.Where(u => u.parentid == menu.id);
            menu.childrens = new List<GetMenuListOutput>();
            foreach (var node in chirldens)
            {
                var newnode = initMenuTree(node, list);
                menu.childrens.Add(newnode);
            }


            return menu;
        }





原创粉丝点击