正向递归和反向递归
来源:互联网 发布:个人编程兼职 编辑:程序博客网 时间: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;
}
- 正向递归和反向递归
- java递归与反向递归
- 递归反向输出字符串
- 递归反向输出字符串
- 递归实现字符串反向
- 递归反向输出字符串
- 反向代理和正向代理
- 正向代理和反向代理
- 正向功和反向功
- 正向代理和反向代理
- 正向代理和反向代理
- 正向代理 和 反向代理
- 正向代理和反向代理
- 正向代理和反向代理
- 正向代理和反向代理服务器
- hibernate 正向和反向工程
- 正向运动学和反向运动学
- 正向代理和反向代理
- TiDB / TiSpark 在易果集团实时数仓中的创新实践
- 第三方支付宝支付
- BeanFactory 与 FactoryBean
- mysql数据库基本操作 (数据类型)
- webstorm常用快捷键
- 正向递归和反向递归
- 第十二周 【项目
- Android 蓝牙键盘快捷键
- 数据结构实验之排序五:归并求逆序数
- IT行业与风投
- JavaScript中的数组创建
- Spring Boot模板引擎
- mybatise一对多关系查询时不能直接分页
- [LeetCode-Algorithms-147] "Insertion Sort List" (2017.12.21-WEEK16)