定义一个经典的目录树类结构的类
这里模拟的是数据库中有一个表,父id:ParentId 对应另一条数据的id,这样样设计,可以让数据一条关联一条,紧密相连,不用再去床第三表来处理数据。
public class TreeNode
{
/// <summary>
/// 子id
/// </summary>
public string Id { get; set; }
/// <summary>
/// 父id
/// </summary>
public string ParentId { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 子节点
/// </summary>
public List<TreeNode> Children { get; set; }
/// <summary>
/// 无参构造函数
/// </summary>
public TreeNode()
{
Children = new List<TreeNode>();
}
/// <summary>
/// 有参构造函数
/// </summary>
/// <param name="id">子id</param>
/// <param name="name">名称</param>
/// <param name="parentId">父id</param>
public TreeNode(string id, string name, string parentId)
{
Id = id;
Name = name;
ParentId = parentId;
Children = new List<TreeNode>();
}
添加初始化数据
弄一点模拟数据
//树状数据结构,最外面的数据,所以设置他们没有父id,所以给他们设置"0"
TreeNode treeNode1 = new TreeNode("1", "山东", "0");
TreeNode treeNode2 = new TreeNode("2", "北京", "0");
TreeNode treeNode3 = new TreeNode("3", "历下区", "1");
TreeNode treeNode4 = new TreeNode("4", "高新区", "1");
TreeNode treeNode5 = new TreeNode("5", "历城区", "1");
TreeNode treeNode6 = new TreeNode("6", "甸柳庄", "1");
TreeNode treeNode7 = new TreeNode("7", "济南长途汽车站东站", "2");
TreeNode treeNode8 = new TreeNode("8", "朝阳区", "1");
TreeNode treeNode9 = new TreeNode("9", "海淀区", "1");
TreeNode treeNode10 = new TreeNode("10", "金盏乡", "1");
List<TreeNode> list = new List<TreeNode>();
list.Add(treeNode1);
list.Add(treeNode2);
list.Add(treeNode3);
list.Add(treeNode4);
list.Add(treeNode5);
list.Add(treeNode6);
list.Add(treeNode7);
list.Add(treeNode8);
list.Add(treeNode9);
list.Add(treeNode10);
核心方法:
解释: - `public static List<TreeNode> BulidTreeByRecursive(List<TreeNode> treeNodes, string id)`:这是一个静态方法,它接受一个节点列表和一个父节点标识 `id`。
`var tree = treeNodes.Where(x => x.ParentId == id).ToList()`:通过 LINQ 查询从节点列表中筛选出父节点标识为给定 `id` 的节点,并转换为列表。
`for (int i = 0; i < tree.Count; i++)`:遍历筛选出的节点列表。
`tree[i].Children = BulidTreeByRecursive(treeNodes, tree[i].Id)`:对于每个节点,递归地调用该方法,以构建其下一级的子节点,将结果赋值给当前节点的“Children”属性。
最后返回构建好的当前层级的节点列表。 总的来说,这个方法的目的是通过递归的方式根据给定的节点列表和父节点标识来构建一棵具有层次结构的树。
public static List<TreeNode> BulidTreeByRecursive(List<TreeNode> treeNodes, string id)
{
var tree = treeNodes.Where(x => x.ParentId == id).ToList();
for (int i = 0; i < tree.Count; i++)
{
tree[i].Children = BulidTreeByRecursive(treeNodes, tree[i].Id);
}
return tree;
}
调用:
这里调用递归方法的时候,传入数据集和一个"0"父id,因为最外面的两条数据没有父id为"0",所以传"0"
var res = BulidTreeByRecursive(list, "0");
这个是个案例,但递归方法可以直接套用,前提是数据表的设计思路和本案例一致