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

news2024/12/24 21:40:15

目录

一、需求:

二、实现代码

三、递归代码

四、思考


一、需求:

给小明一家生成族谱树

二、实现代码

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
        };
    }
}

【效果】

{
    "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": []
                }
            ]
        }
    ]
}

三、递归代码

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.如果根节点不想设为族谱,如何获取从曾祖父开始的递归树 

var result = JsonConvert.SerializeObject(tree);//族谱开始

改为

var result = JsonConvert.SerializeObject(tree.Children.FirstOrDefault());//曾祖父开始

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

【代码】

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

【效果】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四数相加 II--力扣454

四数相加 II 题目思路C代码 题目 思路 我们需要统计元组的个数&#xff0c;并且不需要排序和去重&#xff0c;所以选择哈希表unordered_map。 要使得abcd0&#xff0c;我们首先利用map在前两个数组中统计ab的值以及该值出现的次数。 接下来我们去后两个数组中查找0-(cd)&…

每日一练:除自身以外数组的乘积

一、题目要求 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在…

windows手工杀毒-寻找可疑进程之句柄

上篇回顾&#xff1a;windows手工杀毒-寻找可疑进程之内存-CSDN博客 上篇中我们介绍了如果通过进程的内存分析进程是否是可疑进程&#xff0c;主要是通过查看是否有可写可执行的内存页。也可以通过查看内存内容&#xff0c;看是否是可疑内容&#xff0c;不过这个可能需…

如何取消密码?打印加密的PDF文件?

在日常生活和工作中&#xff0c;我们时常会遇到需要处理加密PDF文件的情况。这些文件可能包含敏感信息&#xff0c;如合同、报告或私人文档&#xff0c;因此被设置了密码保护。然而&#xff0c;有时我们出于工作需要或其他原因&#xff0c;需要打印这些加密的PDF文件。本文将详…

管道检测机器人市场前景:预计2030年全球市场规模将达到18.9亿美元

用于检查管道内堆积的残留物的机器人被称为管道内检查机器人。这种机器人有能力从地面向机器人的控制器发送视频反馈信息。通过这种方式&#xff0c;用户可以验证管道的实际状况&#xff0c;也可以测量管道壁上的沉积物厚度。 据QYResearch调研团队最新报告“全球管道检测机器人…

苹果手机照片被删除?如何通过不同的方法来恢复照片

手机已经成为我们生活中不可或缺的一部分&#xff0c;它不仅仅是通讯工具&#xff0c;更是我们记录生活点滴的重要工具之一。然而&#xff0c;正如其他任何设备一样&#xff0c;iPhone上存储的照片有时也会不小心被删除或丢失。 别担心&#xff0c;即使你误删了重要的照片&…

未来的去中心化网络:Web3与AI的深度融合探讨

在数字技术的快速发展下&#xff0c;Web3和人工智能&#xff08;AI&#xff09;正逐步成为未来互联网的核心支柱。Web3作为一种去中心化的网络架构&#xff0c;致力于重塑互联网的基本结构&#xff0c;而AI则通过智能化技术提升了数据处理和决策的能力。二者的深度融合不仅推动…

数学建模笔记—— 模糊综合评价

数学建模笔记—— 模糊综合评价 模糊综合评价1. 模糊数学概述2. 经典集合和模糊集合的基本概念2.1 经典集合2.2 模糊集合和隶属函数1. 基本概念2.模糊集合的表示方法3. 模糊集合的分类4. 隶属函数的确定方法 3. 评价问题概述4. 一级模糊综合评价模型典型例题 5. 多层次模糊综合…

系统分析师8:项目管理

文章目录 1 内容提要2 范围管理3 时间管理3.1 时间管理-关键路径法3.1.1 时间管理-前导图法&#xff08;单代号网络图&#xff0c;PDM&#xff09;3.1.2 时间管理-箭线图法(双代号网络图&#xff0c;ADM) 4 时间管理-甘特图&#xff08;Gantt&#xff09;5 成本管理6 软件质量管…

超声波眼镜清洗机有用吗? 非常好用的超声波清洗机

随着科技的飞速跃进&#xff0c;现代人的生活质量显著提升&#xff0c;众多日常用品已成为生活的必需品&#xff0c;例如频繁佩戴的眼镜。尽管常规的眼镜布能抹去镜片上的尘埃&#xff0c;但隐匿于细微之处的细菌往往逃过人眼的监察。这些潜在的细菌若不被及时清除&#xff0c;…

NavVis是如何评估数据精度的?

以下文章来源于内芬兹NavVis &#xff0c;作者NavVis NavVis VLX作为移动扫描领域的标杆产品&#xff0c;其数据精度一直是客户关注的重点&#xff0c;今天我们就一起来看看NavVis是如何评估VLX的数据精度的。 评价一款测绘设备的精度时&#xff0c;我们总是将其与业内公认的…

局域网文件分发如何实现?掌握这4个秘籍,文件一键分发破次元!

局域网文件分发是许多企业和组织在日常工作中常见的需求&#xff0c; 有效的文件分发可以显著提高工作效率。 以下是四种实现局域网文件一键分发的秘籍&#xff1a; 1.使用终端监控软件的文件分发功能 软件示例&#xff1a;安企神等。 步骤简述&#xff1a; 安装软件&…

数学建模笔记——熵权法(客观赋权法)

数学建模笔记——熵权法[客观赋权法] 熵权法(客观赋权法)1. 基本概念2. 基本步骤3. 典型例题3.1 正向化矩阵3.2 对正向化矩阵进行矩阵标准化3.3 计算概率矩阵P3.4 计算熵权3.5 计算得分 4. python代码实现 熵权法(客观赋权法) 1. 基本概念 熵权法,物理学名词,按照信息论基本原…

大数据之Flink(四)

11、水位线 11.1、水位线概念 一般实时流处理场景中&#xff0c;事件时间基本与处理时间保持同步&#xff0c;可能会略微延迟。 flink中用来衡量事件时间进展的标记就是水位线&#xff08;WaterMark&#xff09;。水位线可以看作一条特殊的数据记录&#xff0c;它是插入到数…

Linux系统【RockyLinux9.4】下K8S集群【1.31.0】安装部署指南

1.概述 公司之前一直使用的是CentOS系统作为测试、开发、生产环境的基础系统镜像&#xff0c;由于最近的CentOS的镜像彻底终止维护之后&#xff0c;我们在为后续项目的基础系统镜像选型进行的调研&#xff0c; 最好是可以平替的进行类似系统的移植&#xff0c; 经过多番对比&a…

基于锁相环闭环控制AD2S1210旋转变压器测速原理及仿真

旋转变压器通过在转子施加高频励磁信号&#xff0c;通过电磁感应方式在两定子上输出正交的包含转子角度信号&#xff0c;数学建模公式如下&#xff1a; E为幅值&#xff0c;sinwt为转子输入的高频励磁信号&#xff0c;、为电机角度信号 AD2S1210 测角度原理是通过自动控制原理…

进程之间的通信方式

前言 每个进程的用户地址空间都是独立的&#xff0c;一般而言是不能互相访问的&#xff0c;但内核空间是每个进程都共享的&#xff0c;所以进程之间要通信必须通过内核。 Linux提供了以下进程通信方式&#xff1a; 一、管道 所谓的管道&#xff0c;就是内核里面的一串缓存。…

Iceberg与SparkSQL写操作整合

前言 spark操作iceberg之前先要配置spark catalogs&#xff0c;详情参考Iceberg与Spark整合环境配置。 有些操作需要在spark3中开启iceberg sql扩展。 Iceberg使用Apache Spark的DataSourceV2 API来实现数据源和catalog。Spark DSv2是一个不断发展的API&#xff0c;在Spark版…

12. GIS地图制图工程师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

Mac强制删除文件,碰上“拖拽到废纸篓”无法删除时怎么办?

我们都特别喜欢Mac&#xff0c;不仅是因为它漂亮的外观&#xff0c;还有它的运行顺畅、界面友好。然而&#xff0c;就像所有技术产品一样&#xff0c;有时它也会让我们头疼——比如&#xff0c;当某个文件无论如何都删不掉时。你可能遇到过这样的情况&#xff1a;尝试删除一个文…