C#构建树形结构数据(全部构建,查找构建)

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技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C# 利用Aspose.Words.dll将 Word 转成PDF

    下面是详细的攻略: 准备工作 在官网 Aspose.Words for .NET 下载最新版的 Aspose.Words for .NET。 创建一个 C# 控制台应用程序,导入 Aspose.Words.dll。 using Aspose.Words; 代码实现 使用 Aspose.Words 加载 Word 文件。在加载过程中,Aspose.Words会…

    C# 2023年5月31日
    00
  • c#中如何去除字符串左边的0

    要去除C#中字符串左侧的0,我们可以使用TrimStart()方法。下面是详细的步骤: 步骤1:使用字符串.TrimStart(char[])方法去掉左侧的“0” 使用字符串的TrimStart(char[])方法,可以去掉字符串左侧指定字符集合中的所有字符。由于我们只需要去掉左侧的0,因此我们只需要将0加入到字符集合中即可。下面是一个简单的示例代码: st…

    C# 2023年6月6日
    00
  • C#开启线程的四种示例

    我将为您详细讲解“C#开启线程的四种示例”的完整攻略。 什么是线程? 线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程(Process)之中,是进程中的实际运作单位。 在C#中,我们可以使用Thread类在程序中创建并开启线程。 使用Thread类开启线程的四种方式 方式一:使用ThreadStart委托 Thread t = new…

    C# 2023年6月1日
    00
  • C# 实现WebSocket服务端教程

    针对“C# 实现WebSocket服务端教程”,我将提供完整的攻略。下面是详细的步骤: 步骤一:创建一个空的C#控制台应用程序 可以使用Visual Studio进行创建,也可以使用命令行创建,此处不再赘述。在创建时,需要选择.NET Core 3.x或者.NET 5+作为Target Framework。 步骤二:添加NuGet包 在控制台中输入以下命令,…

    C# 2023年5月31日
    00
  • macOS系统下Vscode的python配置教程

    下面是详细讲解“macOS系统下Vscode的python配置教程”的完整攻略: 步骤一:安装Python环境 在macOS系统中,Python环境已经默认安装,如果没有安装,可以到 Python官网 下载安装。安装完成后,打开Terminal终端,输入 python 命令,如果出现 python 的版本信息,则表示已经安装成功了。 步骤二:安装Visual…

    C# 2023年5月31日
    00
  • 关于C#连接SQL Server时提示用户登录失败的解决方法

    下面就是关于C#连接SQLServer时提示用户登录失败的解决方法的完整攻略: 1. 检查用户名和密码是否正确 第一步,你应该检查你提供的用户名和密码是否正确。在C#中,利用SqlConnectionStringBuilder类创建连接字符串,其中包括用户名和密码信息。示例代码如下: SqlConnectionStringBuilder builder = …

    C# 2023年5月14日
    00
  • C#异常处理的一些经验和技巧

    C#异常处理的一些经验和技巧 概述 在编写C#程序时,避免不了会出现各种错误,例如:空引用、下标越界、文件不存在等等。这些错误如果不进行正确的处理,程序可能会崩溃甚至可能会损失一些敏感信息。本文将会为你介绍一些常见的C#错误处理技巧,帮助你更好地控制程序的异常情况。 try-catch语句 try-catch语句是C#语言中处理异常情况的一种常用技巧。try…

    C# 2023年5月15日
    00
  • C# String.Join()方法: 连接一个数组中的元素,用指定的分隔符隔开

    String.Join()方法是C#中提供的一个字符串处理方法,可用于将一个一维数组中的元素通过指定的分隔符进行连接,并返回一个新的字符串。使用String.Join()方法可以很方便地将数组中的元素拼接到一起,以便进行后续操作,例如输出、存储等。 该方法的使用格式如下: string joinedString = String.Join(separator…

    C# 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部