本文介绍了使用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;
}
}