使用递归得到菜单树

 递归在我们平常的练习中经常会使用到,那么到底什么是递归呢?
递归: 它是指一段程序直接或者间接调用自身的一种方法,通过这种形式执行需要进行一些固定步骤的许多操作,它可以把一个复杂并且庞大的问题简单化,通过专注于解决它分化出来的小问题从而解决大问题,从而大大减少我们的代码量,是提高我们编码效率的很好方法。

递归的主要点:
1、递归函数的参数和返回值
2、终止条件
3、递归的逻辑设计
 

目标是得到如下的效果:

        /// <summary>
        /// 提供数据源使用
        /// </summary>
        public class Enum
        {
            /// <summary>
            /// 父级菜单编号
            /// </summary>
            public string menu_nbr { get; set; }
            /// <summary>
            /// 当前菜单序号
            /// </summary>
            public int menu_select { get; set; }
            /// <summary>
            /// 菜单标签
            /// </summary>
            public string menu_lable { get; set; }
        }

 

 /// <summary>
 /// 菜单类
 /// </summary>
 public class MenuHelp
        {
            public MenuHelp()
            {
                Childen = new List<MenuHelp>();
            }

            /// <summary>
            /// 父级菜单编号
            /// </summary>
            public string menu_nbr { get; set; }
            /// <summary>
            /// 当前菜单序号
            /// </summary>
            public int menu_select { get; set; }
            /// <summary>
            /// 菜单标签
            /// </summary>
            public string menu_lable { get; set; }
            /// <summary>
            /// 菜单描述
            /// </summary>
            public string Remark { get; set; }
            /// <summary>
            /// 排序
            /// </summary>
            public int Sort { get; set; }

            public List<MenuHelp> Childen { get; set; }
        }
public static List<MenuHelp> GetMenuTree(string menu)
        {
            try
            {
                //充当数据源
                List<Enum> menu_mstr = new List<Enum>()
                {
                    new Enum(){menu_nbr="X",menu_select=10,menu_lable="系统管理" },
                    new Enum(){menu_nbr="X",menu_select=20,menu_lable="基础数据" },
                    new Enum(){menu_nbr="10",menu_select=1,menu_lable="权限维护" },
                    new Enum(){menu_nbr="10",menu_select=2,menu_lable="标签维护" },
                    new Enum(){menu_nbr="10.1",menu_select=1,menu_lable="公司维护" },
                    new Enum(){menu_nbr="10.1",menu_select=2,menu_lable="域维护" },
                    new Enum(){menu_nbr="10.1",menu_select=3,menu_lable="权限分配" },
                    new Enum(){menu_nbr="10.1.3",menu_select=1,menu_lable="用户维护" },
                    new Enum(){menu_nbr="20",menu_select=1,menu_lable="错误信息维护" },
                };

                var tree = new List<MenuHelp>();
                var children = menu_mstr.Where(m => m.menu_nbr == menu).ToList();
                if (children.Count > 0)
                {
                    for (var i = 0; i < children.Count; i++)
                    {
                        string lable = children[i].menu_nbr == "X" ? $"{children[i].menu_select}" : $"{children[i].menu_nbr}.{children[i].menu_select}";
                        MenuHelp itemMenu = new MenuHelp()
                        {
                            menu_nbr = children[i].menu_nbr,
                            menu_select = children[i].menu_select,
                            menu_lable = children[i].menu_lable,
                            Remark = $"{lable} {children[i].menu_lable}",
                            Childen = GetMenuTree(lable),
                            Sort = Convert.ToInt32(string.IsNullOrEmpty(lable) ? "0" : lable.Replace(".", ""))
                        };
                        tree.Add(itemMenu);
                        Console.WriteLine(itemMenu.Remark);
                    }
                }
                return tree.OrderBy(oo => oo.Sort).ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
//直接调用即可 
List<MenuHelp> result= GetMenuTree("X");

这是运行的结果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值