C#高级:递归3-根据ID连续递归生成一颗递归树

目录

一、需求:

二、实现代码

三、递归代码

四、思考


一、需求:

给小明一家生成族谱树

二、实现代码

cs 复制代码
using Newtonsoft.Json;


class Person
{
    public int Id { get; set; }
    public int? ParentID { get; set; }
    public string Name { get; set; }
}

class TreeDto : Person
{
    [JsonProperty(Order =99)]
    public List<TreeDto> Children = new List<TreeDto>();
}

class Program
{
    static List<Person> PersonList = new List<Person>()
    {
        new Person(){ Id=1,ParentID=null,Name="小明曾祖父",},
        new Person(){ Id=2,ParentID=1,Name="小明爷爷",},
        new Person(){ Id=3,ParentID=1,Name="小明二爷爷",},
        new Person(){ Id=4,ParentID=1,Name="小明三爷爷",},
        new Person(){ Id=5,ParentID=2,Name="小明爸爸",},
        new Person(){ Id=6,ParentID=2,Name="小明叔叔",},
        new Person(){ Id=7,ParentID=5,Name="小明本人",},
        new Person(){ Id=8,ParentID=5,Name="小明妹妹",},
        new Person(){ Id=9,ParentID=7,Name="小明儿子",}
    };

    static void Main()
    {
        TreeDto tree = BuildTree(null);//传入列表根节点【小明曾祖父】,开始递归
        var result = JsonConvert.SerializeObject(tree);//实体=>JSON打印
        Console.WriteLine(result);
    }

    static TreeDto BuildTree(int? parentId)
    {
        var children = PersonList
            .Where(p => p.ParentID == parentId)
            .Select(p => new TreeDto
            {
                Id = p.Id,
                ParentID = p.ParentID,
                Name = p.Name,
                Children = BuildTree(p.Id).Children
            })
            .ToList();

        return new TreeDto
        {
            Id = parentId ?? 0, //父级Id
            ParentID = null,
            Name = "族谱",
            Children = children
        };
    }
}

【效果】

javascript 复制代码
{
    "Id": 0,
    "ParentID": null,
    "Name": "族谱",
    "Children": [
        {
            "Id": 1,
            "ParentID": null,
            "Name": "小明曾祖父",
            "Children": [
                {
                    "Id": 2,
                    "ParentID": 1,
                    "Name": "小明爷爷",
                    "Children": [
                        {
                            "Id": 5,
                            "ParentID": 2,
                            "Name": "小明爸爸",
                            "Children": [
                                {
                                    "Id": 7,
                                    "ParentID": 5,
                                    "Name": "小明本人",
                                    "Children": [
                                        {
                                            "Id": 9,
                                            "ParentID": 7,
                                            "Name": "小明儿子",
                                            "Children": []
                                        }
                                    ]
                                },
                                {
                                    "Id": 8,
                                    "ParentID": 5,
                                    "Name": "小明妹妹",
                                    "Children": []
                                }
                            ]
                        },
                        {
                            "Id": 6,
                            "ParentID": 2,
                            "Name": "小明叔叔",
                            "Children": []
                        }
                    ]
                },
                {
                    "Id": 3,
                    "ParentID": 1,
                    "Name": "小明二爷爷",
                    "Children": []
                },
                {
                    "Id": 4,
                    "ParentID": 1,
                    "Name": "小明三爷爷",
                    "Children": []
                }
            ]
        }
    ]
}

三、递归代码

cs 复制代码
static TreeDto BuildTree(int? parentId)
{
    var children = PersonList
        .Where(p => p.ParentID == parentId)
        .Select(p => new TreeDto
        {
            Id = p.Id,
            ParentID = p.ParentID,
            Name = p.Name,
            Children = BuildTree(p.Id).Children
        })
        .ToList();

    return new TreeDto
    {
        Id = parentId ?? 0, //父级Id
        ParentID = null,
        Name = "族谱",
        Children = children
    };
}

四、思考

1.设定序列化的字段顺序,例如将Children这个字段放最后面

2.递归的写法注释

3.如果根节点不想设为族谱,如何获取从曾祖父开始的递归树

cs 复制代码
var result = JsonConvert.SerializeObject(tree);//族谱开始

改为

cs 复制代码
var result = JsonConvert.SerializeObject(tree.Children.FirstOrDefault());//曾祖父开始

4.如果想在族谱上加一个根节点,如何操作

【代码】

cs 复制代码
 TreeDto tree = BuildTree(null);//获取递归结果
 var result = new TreeDto
 {
     Id = 1000,
     Name = "新增根节点",
     Children = new List<TreeDto>() { tree }
 };

【效果】

相关推荐
William_cl9 分钟前
一、前置基础(MVC学习前提)_核心特性_【C# 泛型入门】为什么说 List<T>是程序员的 “万能收纳盒“?避坑指南在此
学习·c#·mvc
白熊18812 分钟前
【图像大模型】ms-swift 深度解析:一站式多模态大模型微调与部署框架的全流程使用指南
开发语言·ios·swift
幸福清风18 分钟前
【Python】基于Tkinter库实现文件夹拖拽与选择功能
windows·python·microsoft·tkinter
NineData35 分钟前
NineData将亮相第27届GOPS全球运维大会,并带来技术演讲
运维·数据库·ninedata·智能·ai agent·数据管理工具·gops全球运维大会
不良人天码星1 小时前
谈谈redis的持久化
数据库·redis·缓存
qiuiuiu4131 小时前
正点原子RK3568学习日志6-驱动模块传参
linux·c语言·开发语言·单片机·学习
云闲不收1 小时前
golang的一些技巧
开发语言·后端·golang
凸头1 小时前
责任链模式
java·开发语言·责任链模式
qq_479875432 小时前
TimerFd & Epoll
java·服务器·数据库
兮兮能吃能睡2 小时前
资料片:R语言中常见的英文术语及其含义
开发语言·r语言