C#构建树形结构数据(全部构建,查找构建)
前言
树形结构数据在实际开发中非常常见,具有分级、层级、分类等特点,通常应用于目录结构、组织机构、商品分类等场景。本文将介绍如何使用C#构建树形结构数据,包括全部构建和查找构建两种方案。
全部构建
步骤一:定义数据结构
我们假设有一个数据表,包含id、parentId、name三个字段,其中id为自增主键,parentId为父节点id,name为节点名称,例如:
id | parentId | name |
---|---|---|
1 | 0 | 根节点1 |
2 | 1 | 二级节点1 |
3 | 1 | 二级节点2 |
4 | 2 | 三级节点1 |
5 | 2 | 三级节点2 |
我们可以定义一个与之对应的数据结构,例如:
public class TreeNode
{
public int Id { get; set; }
public string Name { get; set; }
public List<TreeNode> Children { get; set; }
}
其中,Id为节点id,Name为节点名称,Children为子节点集合。
步骤二:加载数据
我们需要将数据表中的数据加载到内存中,使用List
List<TreeNode> nodes = new List<TreeNode>();
// 加载数据
foreach (DataRow row in dataTable.Rows)
{
var node = new TreeNode
{
Id = row.Field<int>("id"),
Name = row.Field<string>("name")
};
nodes.Add(node);
}
步骤三:构建树形结构
接下来的任务就是将这个扁平的节点列表转换成树形结构。我们可以采用递归的方式进行构建:
public static List<TreeNode> BuildTree(List<TreeNode> nodes, int parentId = 0)
{
var tree = new List<TreeNode>();
foreach (var node in nodes.Where(n => n.ParentId == parentId))
{
node.Children = BuildTree(nodes, node.Id);
tree.Add(node);
}
return tree;
}
当parentId为0时,意味着构建根节点。对于每一个节点,我们在nodes中查找其子节点,并添加到Children中。
步骤四:完整代码
public class TreeNode
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
public List<TreeNode> Children { get; set; }
}
public static class TreeBuilder
{
public static List<TreeNode> BuildTree(List<TreeNode> nodes, int parentId = 0)
{
var tree = new List<TreeNode>();
foreach (var node in nodes.Where(n => n.ParentId == parentId))
{
node.Children = BuildTree(nodes, node.Id);
tree.Add(node);
}
return tree;
}
}
查找构建
如果数据量较大,全部构建可能会导致性能问题。在这种情况下,我们可以使用查找构建的方式,只构建需要的节点。
步骤一:定义数据结构
与全部构建相同,我们需要定义一个树形结构的节点类:
public class TreeNode
{
public int Id { get; set; }
public string Name { get; set; }
public List<TreeNode> Children { get; set; }
}
步骤二:加载数据
同样是将数据表中的数据加载到内存中,使用List
List<TreeNode> nodes = new List<TreeNode>();
// 加载数据
foreach (DataRow row in dataTable.Rows)
{
var node = new TreeNode
{
Id = row.Field<int>("id"),
Name = row.Field<string>("name")
};
nodes.Add(node);
}
步骤三:查找构建
我们通过递归的方式,构建指定节点的树形结构。具体实现如下:
public static List<TreeNode> BuildTree(List<TreeNode> nodes, int id)
{
var tree = new List<TreeNode>();
foreach (var node in nodes.Where(n => n.ParentId == id))
{
node.Children = BuildTree(nodes, node.Id);
tree.Add(node);
}
return tree;
}
步骤四:完整代码
public class TreeNode
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
public List<TreeNode> Children { get; set; }
}
public static class TreeBuilder
{
public static List<TreeNode> BuildTree(List<TreeNode> nodes, int parentId = 0)
{
var tree = new List<TreeNode>();
foreach (var node in nodes.Where(n => n.ParentId == parentId))
{
node.Children = BuildTree(nodes, node.Id);
tree.Add(node);
}
return tree;
}
public static List<TreeNode> BuildSubTree(List<TreeNode> nodes, int id)
{
var tree = new List<TreeNode>();
foreach (var node in nodes.Where(n => n.Id == id))
{
node.Children = BuildTree(nodes, node.Id);
tree.Add(node);
}
return tree;
}
}
示例说明
我们假设有一张商品分类表,其中的数据如下:
id | parentId | name |
---|---|---|
1 | 0 | 电器类 |
2 | 1 | 彩电类 |
3 | 1 | 冰箱类 |
4 | 2 | 液晶电视 |
5 | 2 | 智能电视 |
6 | 3 | 单门冰箱 |
7 | 3 | 双门冰箱 |
示例一:全部构建
我们可以使用以下代码构建整个树形结构:
List<TreeNode> nodes = LoadDataFromDb();
List<TreeNode> tree = TreeBuilder.BuildTree(nodes);
构建出的树形结构如下:
电器类
|--彩电类
| |--液晶电视
| |--智能电视
|--冰箱类
|--单门冰箱
|--双门冰箱
示例二:查找构建
如果我们只需要构建彩电类及其子类别的树形结构,我们可以使用以下代码:
List<TreeNode> nodes = LoadDataFromDb();
List<TreeNode> tree = TreeBuilder.BuildSubTree(nodes, 2);
构建出的树形结构如下:
彩电类
|--液晶电视
|--智能电视
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#构建树形结构数据(全部构建,查找构建) - Python技术站