最近在找工作,因为现在这家公司属实有点坑啊,我才来了几个月一半时间出差在外省,我好不容易从上海回来长沙,结果天天在比上海还要远的贵州深山里面过着与世隔绝的日子(俗称修仙了)
面试题很多,其他的我也不总结了,无非就是基础知识,论坛里面一搜索一大把,但是关于这个递归实现树形菜单结构,我当时居然脑袋懵逼了,没做出来,搞得我自己都怀疑人生了,太久没用了也没有去温习递归回来赶紧看下递归的逻辑写了如下demo:
主要思想就是,树形菜单时多级的,假设我们不知道会有多少层的时候,该怎么办,有父级菜单,也有子级菜单。子级菜单又会有子级菜单,那么对于子级的下一级菜单来说,这个子级就是下当前这个菜单的父级菜单了。所以我们的关键点就在于从第一级的父级菜单开始输出菜单,并且同时通过递归的形式不断地输出当前菜单的子级数据集。代码:
定义一个菜单类,作为单个菜单的对象
/// <summary>
/// 菜单基础数据类
/// </summary>
public class Menu
{
public int Code { get; set; }
public string TreeName { get; set; }
public int ParentId { get; set; }
}
再定义一个要输出的树形结构菜单类,主要区别在于包含了子级菜单的属性:
public class TreeMenu
{
public int Code { get; set; }
public string TreeName { get; set; }
public int ParentId { get; set; }
public List<TreeMenu> Children { get; set; }
}
定义基础数据:
List<Menu> Tree = new List<Menu>();
Menu node = new Menu();
node.Code = 1;
node.TreeName = "菜单A";
node.ParentId = 0;
Tree.Add(node);
Menu node1 = new Menu();
node1.Code = 2;
node1.TreeName = "菜单B";
node1.ParentId = 0;
Tree.Add(node1);
Menu node2 = new Menu();
node2.Code = 3;
node2.TreeName = "二级菜单";
node2.ParentId = 1;
Tree.Add(node2);
Menu node3 = new Menu();
node3.Code = 4;
node3.TreeName = "菜单C";
node3.ParentId = 0;
Tree.Add(node3);
Menu node4 = new Menu();
node4.Code = 5;
node4.TreeName = "二级菜单";
node4.ParentId = 2;
Tree.Add(node4);
Menu node5 = new Menu();
node5.Code = 6;
node5.TreeName = "三级菜单";
node5.ParentId = 3;
Tree.Add(node5);
基本的数据结构和需要使用到的类都初始化好了,咱么来看具体的递归实现方法,可以实现理论无限级递归:
//list就是基础数据链表
//pid 要查找的当前菜单的ID或编码,也就是通过这个ID判断是否有比它更高一级的父级菜单
public static List<TreeMenu> getNode1(List<Menu> list, int pid)
{
List<TreeMenu> data = new List<TreeMenu>();
var tree = list.Where(n => n.ParentId == pid);
foreach (var item in tree)
{
Console.WriteLine(item.TreeName);
TreeMenu menu = new TreeMenu()
{
Children = getNode1(list, item.Code),
Code = item.Code,
ParentId = item.ParentId,
TreeName = item.TreeName
};
data.Add(menu);
}
return data;
}
调用:
//0 标识从一级菜单开始递归,因为以及菜单的parentid都是等于0的。
List<TreeMenu> data = getNode1(Tree,0);
结束。