C# 用菜单数据生成一个菜单树

本文介绍了使用C#递归方法生成菜单树的实现方案。代码定义了两个核心类:Menu用于存储基础菜单数据,MenuTree用于构建树形结构。通过GetMenuTree递归方法,将平面菜单数据转换为层级树结构,其中处理了根节点(X)的特殊情况。示例中演示了从模拟数据构建菜单树,并利用GetData方法递归遍历打印节点信息。该实现展示了递归在树形数据结构处理中的典型应用,适用于系统菜单、组织架构等层级数据的展示需求。下面直接上干货:

using System;
using static Class1;
/// <summary>
/// 生成菜单树
/// </summary>
class Class1
{
    static void Main(string[] args)
    {
        //生成菜单树
        //根节点菜单传进去递归就行了
        var roleMenu = _menusData.Where(x => x.MenuNbr == "X").ToList();
        var treeMenu = roleMenu.Select(x => GetMenuTree(x)).ToList();
        foreach (var item in treeMenu)
        {
            GetData(item);
        }
    }

    //打印遍历树节点数据
    static void GetData(MenuTree childrenTree)
    {
        Console.WriteLine("节点ID:" + childrenTree.MenuTreeId + " 节点Label:" + childrenTree.MenuTreeLabel);
        //有子节点
        if (childrenTree.MenuTreeChildren.Count > 0)
        {
            foreach (var children in childrenTree.MenuTreeChildren)
            {
                GetData(children);
            }
        }
    }

    //定义菜单类
    public class Menu
    {
        public string MenuNbr { get; set; }
        public string MenuSelect { get; set; }
        public string MenuLabel { get; set; }
    }

    //定义接收菜单树数据的结构
    public class MenuTree
    {
        public string MenuTreeId { get; set; }
        public string MenuTreeLabel { get; set; }
        public List<MenuTree> MenuTreeChildren { get; set; }
    }

    // 模拟数据库数据
    static public List<Menu> _menusData = new List<Menu>
    {
        new Menu { MenuNbr = "X", MenuSelect = "10", MenuLabel = "系统管理" },
        new Menu { MenuNbr = "X", MenuSelect = "20", MenuLabel = "基础数据" },
        new Menu { MenuNbr = "10", MenuSelect = "1", MenuLabel = "权限维护" },
        new Menu { MenuNbr = "10", MenuSelect = "2", MenuLabel = "标签维护" },
        new Menu { MenuNbr = "10.1", MenuSelect = "1", MenuLabel = "公司维护" },
        new Menu { MenuNbr = "10.1", MenuSelect = "2", MenuLabel = "域维护" },
        new Menu { MenuNbr = "10.1", MenuSelect = "3", MenuLabel = "权限分配" },
        new Menu { MenuNbr = "10.1.3", MenuSelect = "1", MenuLabel = "用户维护" },
        new Menu { MenuNbr = "20", MenuSelect = "1", MenuLabel = "错误信息维护" }
    };

    //利用递归实现生成菜单树
    static public MenuTree GetMenuTree(Menu menu)
    {
        //初始化菜单树节点
        var menuTreeNode = new MenuTree
        {
            MenuTreeId = menu.MenuNbr == "X" ? $"{menu.MenuSelect}" : $"{menu.MenuNbr}.{menu.MenuSelect}",
            MenuTreeLabel = menu.MenuLabel,
            MenuTreeChildren = new List<MenuTree>()
        };
        //根节点是,处理下X的情况
        var children = _menusData.Where(x => menu.MenuNbr == "X" ? x.MenuNbr == $"{menu.MenuSelect}" : x.MenuNbr == $"{menu.MenuNbr}.{menu.MenuSelect}").ToList();

        foreach (var item in children)
        {
            menuTreeNode.MenuTreeChildren.Add(GetMenuTree(item));
        }

        return menuTreeNode;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值