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

devtools/2025/1/16 18:08:33/

目录

一、需求:

二、实现代码

三、递归代码

四、思考


一、需求:

给小明一家生成族谱树

二、实现代码

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, //父级IdParentID = 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, //父级IdParentID = 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.ppmy.cn/devtools/109806.html

相关文章

基于深度学习的对抗鲁棒性增强

基于深度学习的对抗鲁棒性增强是指通过各种方法提升深度学习模型抵御对抗样本攻击的能力&#xff0c;从而确保模型在恶意干扰下依然能够做出正确的判断和决策。对抗鲁棒性是当前深度学习安全领域的一个关键研究方向&#xff0c;因为深度学习模型常常容易受到对抗样本的攻击&…

git:标签管理

目录 一、标签概念 二、创建标签 三、标签操作 一、标签概念 标签tag&#xff0c;用来标识某次提交commit&#xff0c;相当于起一个别名。例如&#xff0c;在一个软件项目中&#xff0c;当要发行某一个版本时&#xff0c;针对最后一次提交commit打一个v1.0这样的标签tag来标识…

设计模式-面试题(工厂方法模式、策略模式和责任链模式)

开闭原则&#xff1a;扩展开放、修改关闭 工厂设计模式&#xff1a;解耦 简单工厂模式 CoffeeStore和SimpleCoffeeFactory的耦合、SimpleCoffeeFactory和Coffee的耦合 后续如果再加新品种的咖啡&#xff0c;需要修改SimpleCoffeeFactory&#xff0c;这样就违反了开闭原则 简单…

全志A527 A133 A523 T527 T133 H6 H8应用无法开启后台服务

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1 代码修改方法14.2 代码修改方法24.3 代码修改方法35.彩蛋1.前言 像全志的很多平台,普通的app并不能正常的启动后台的服务,这样对于应用层很困扰,无法启动后台的服务,功能就不能正常使用…

喜欢干净简洁音乐播放器的朋友看过来

大家好&#xff0c;我是晓凡。 不少程序员小伙伴都喜欢边听音乐边敲代码&#xff0c;尤其在一个嘈杂的环境中&#xff0c;一个好的想法、好的思路可能就因为一瞬间的干扰就没了。 这时&#xff0c;如果耳机一戴上&#xff0c;听着音乐能更好的集中注意力&#xff1b;遇到bug也…

【机器学习】隐马尔可夫模型的基本概念和应用领域以及在NLP中如何实现(含python代码)

引言 隐马尔可夫模型&#xff08;Hidden Markov Model&#xff0c;HMM&#xff09;是一种统计模型&#xff0c;用于描述一个含有隐含状态的马尔可夫过程 文章目录 引言一、隐马尔可夫模型的基本概念1.1 HMM的基本组成1.2 HMM的三个基本问题1.3 解决HMM问题的算法1.4 在python中…

Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?

技术选型 我们知道&#xff0c;Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求&#xff0c;需要播放端&#xff0c;能支持YUV或ARG的数据回调&#xff0c;一般来说&#xff0c;可参考的方法如下&#xff1a; 1. 使用…

vue组件通信

父传子 父组件通过自定义属性向子传值&#xff0c;子通过props接收 示例一&#xff1a; 示例二&#xff1a; 注意&#xff1a; 子传父 props完整写法&#xff1a;