C#高级:递归2-根据ID反向递归求其所有的祖先节点信息

news2024/9/22 19:36:40

目录

一、实现demo

二、封装方法

【ID=>祖先ID】

【ID=>祖先实体】

三、递归讲解


一、实现demo

class MainClass
{
    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="小明儿子",}
    };

    public static List<int> GetAncestors(int id)
    {
        var result = new List<int>(); // 初始化一个结果列表,用于存储所有父级 ID
        var parent = PersonList.FirstOrDefault(p => p.Id == id)?.ParentID; // 查找当前 ID 的父节点 ID

        if (parent.HasValue) // 如果有父节点
        {
            result.Add(parent.Value); // 将父节点 ID 添加到结果列表中
            result.AddRange(GetAncestors(parent.Value)); // 递归查找并添加父节点的所有上级 ID
        }

        return result; // 返回包含所有父级 ID 的列表
    }


    public static List<Person> GetPersonAncestors(int id)
    {
        var result = new List<Person>(); // 初始化一个结果列表,用于存储所有父级 Person 对象
        var person = PersonList.FirstOrDefault(p => p.Id == id); // 查找当前 ID 的 Person 对象

        if (person != null && person.ParentID.HasValue) // 如果找到 Person 对象且有父节点
        {
            var parent = PersonList.FirstOrDefault(p => p.Id == person.ParentID.Value); // 查找父节点 Person 对象
            if (parent != null)
            {
                result.Add(parent); // 将父节点 Person 对象添加到结果列表中
                result.AddRange(GetPersonAncestors(parent.Id)); // 递归查找并添加父节点的所有上级 Person 对象
            }
        }

        return result; // 返回包含所有父级 Person 对象的列表
    }


    static void Main(string[] args)
    {
        //要求:根据ID求其所有父级ID
        var ids = GetAncestors(9);
        var persons =GetPersonAncestors (9);
        ;
    }
}
class Person
{
    public int Id;
    public string Name;
    public int? ParentID;
}

二、封装方法

【ID=>祖先ID】

public static List<int> GetAncestors(int id)
{
    var result = new List<int>(); // 初始化一个结果列表,用于存储所有父级 ID
    var parent = PersonList.FirstOrDefault(p => p.Id == id)?.ParentID; // 查找当前 ID 的父节点 ID

    if (parent.HasValue) // 如果有父节点
    {
        result.Add(parent.Value); // 将父节点 ID 添加到结果列表中
        result.AddRange(GetAncestors(parent.Value)); // 递归查找并添加父节点的所有上级 ID
    }

    return result; // 返回包含所有父级 ID 的列表
}

【ID=>祖先实体】

public static List<Person> GetPersonAncestors(int id)
{
    var result = new List<Person>(); // 初始化一个结果列表,用于存储所有父级 Person 对象
    var person = PersonList.FirstOrDefault(p => p.Id == id); // 查找当前 ID 的 Person 对象

    if (person != null && person.ParentID.HasValue) // 如果找到 Person 对象且有父节点
    {
        var parent = PersonList.FirstOrDefault(p => p.Id == person.ParentID.Value); // 查找父节点 Person 对象
        if (parent != null)
        {
            result.Add(parent); // 将父节点 Person 对象添加到结果列表中
            result.AddRange(GetPersonAncestors(parent.Id)); // 递归查找并添加父节点的所有上级 Person 对象
        }
    }

    return result; // 返回包含所有父级 Person 对象的列表
}

三、递归讲解

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

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

相关文章

《论面向方面的编程技术及其应用》写作框架,软考高级系统架构设计师

论文真题 随着社会信息化进程的加快&#xff0c;计算机及网络已经被各行各业广泛应用&#xff0c;信息安全问题也变得愈来愈重要。它具有机密性、完整性、可用性、可控性和不可抵赖性等特征。信息系统的安全保障是以风险和策略为基础&#xff0c;在信息系统的整个生命周期中提…

基于Java+SpringBoot+Vue+MySQL的西安旅游管理系统网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的西安旅游管理系统网站【附源码文档】、…

美团OC感想

OC感想 晚上十点拿到美团意向了 到家事业部。&#xff0c;日常实习没过&#xff0c;暑期实习没过&#xff0c;秋招终于意向了&#xff0c;晚上十点发的&#xff0c;整整激动到一点才睡着&#xff0c;不仅因为这是秋招的第一个意向&#xff0c;更因为这是我一直心心念念想去的地…

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中&#xff0c;管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等&#xff0c;都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools&#xff1f; pip-tools 是一组命令行工具&…

2024-09-08 小红书机试 解题报告 | 珂学家

前言 题解 这是2024年9月8号的小红书机试题。 看到群里有人在讨论&#xff0c;小红书的机试题&#xff0c;顺手做了下&#xff0c;感觉挺有意思的。 现在的机试题&#xff0c;是真的难&#xff0c;好卷。 A. 机器人 题目描述: m * n的格子&#xff0c;都有一个方向指令LRUD…

挑战当前最难、规模最大多模态评测基准MME-RealWorld,QwenVL-2位列第一但并未及格

32 个标注者&#xff0c;29,429 条标注数据&#xff0c;图像平均分辨率 20001500&#xff0c;当前最难最大的纯手工标注图像感知 benchmark 来了&#xff01;现有模型没有一个在总分上取得 60% 以上的准确率。 论文链接&#xff1a; https://arxiv.org/abs/2408.13257 项目主…

MLLM(三)| BigModel平台正式上线Plus系列全家桶

2024年8月28日&#xff0c;在ACM SIGKDD&#xff08;国际数据挖掘与知识发现大会&#xff0c;KDD&#xff09;会议现场&#xff0c;智谱AI重磅推出新一代全自研基座大模型GLM-4-Plus、图像/视频理解模型GLM-4V-Plus和文生图模型CogView-3-Plus。 1、模型介绍页&#xff1a;htt…

Maven项目父模块POM中是否应该包含SpringBoot打包插件(spring-boot-maven-plugin)

父模块POM是否包含SpringBoot打包插件 一、场景 一个基于SpringBoot的Maven父子模块的项目&#xff08;一个父项目中包含多个子项目&#xff09;&#xff0c;父模块 POM文件中&#xff0c;是否应该包含打包需要的插件&#xff08;spring-boot-maven-plugin&#xff09;&#…

strcat函数的使用和模拟实现

目录 1.头文件 2.函数功能​编辑 3.注意事项&#xff1a; 4.strcat函数模拟实现&#xff1a; 方源一把抓住VS2022&#xff0c;催动春秋产的气息&#xff0c;顷刻炼化&#xff01; 1.头文件 strcat函数的使用&#xff0c;需要头文件 #include<string.h>2.函数功能 s…

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

Course1-Week1: https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Supervised%20Machine%20Learning%20Regression%20and%20Classification/week11️⃣线性回归&#xff08;linear regression&#xff09; f w , b ( x ) w x b f_{w,b}(x) wx b …

【深度学习讲解笔记】前言

小编为AI专业的本科学生&#xff0c;最近入手了一本《深度学习讲解》的书&#xff0c;由于封面画了苹果&#x1f34e;&#xff0c;所以也叫苹果书&#xff0c;这本书目前在全网的热度很高。 本书是根据李宏毅老师讲授的《机器学习》课程编写的&#xff0c;作者是来自DataWhale…

SCI顶刊中“introduction”经典模板,建议收藏!

Introduction Introduction 的行文框架是一个从较宽泛的学术领域逐渐缩小到你的研究目标的过程。 1.研究背景和重要性 (Background AndImportance) • Mention of previous work on the subject • A statement of the importance of the subject 引言部分的第一段需要给出…

(Charles)如何抓取手机http的报文

抓包的目的&#xff1a; 发现bug需要定位要抓包 检查数据传输的安全性 接口测试遇到需求文档不全要抓包 抓包主要抓取的是http协议&#xff08;https协议&#xff09;的报文 http协议规范客户端和服务端的数据传输格式&#xff0c;是一个标准和规范 每个http连接包括请求消息和…

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya&#xff08;不是本人&#xff0c;claude AI&#xff09;在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容&#xff1a; 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用&…

CSP-J基础之数学基础 杨辉三角 一篇搞懂

文章目录 前言杨辉三角介绍杨辉三角的结构数学中的形式杨辉三角的性质 杨辉三角进行左对齐杨辉三角的递推公式编程实现杨辉三角总结 前言 杨辉三角是数学中一个非常有趣且重要的概念。它不仅在组合数学中扮演着重要角色&#xff0c;还在许多数学问题的解决中提供了有力的工具。…

【重学 MySQL】二十、运算符的优先级

【重学 MySQL】二十、运算符的优先级 MySQL 运算符的优先级&#xff08;由高到低&#xff09;注意事项示例 在 MySQL 中&#xff0c;运算符的优先级决定了在表达式中各个运算符被计算的先后顺序。了解运算符的优先级对于编写正确且高效的 SQL 语句至关重要。以下是根据高权威性…

Rust运算符

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) https://blog.csdn.net/brucexia/category_12779443.html 前面已经学习了变量和常量&#xff0c;本节开始对它们进行操作&#xff0c…

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站&#xff0c;手机流量可以访问IPV6网络的服务&#xff0c;为什么不在电脑搭建Home Assistant&am…

springboot体会BIO(阻塞式IO)

使用springboot体会阻塞式IO 大致的思路为&#xff1a; 创建一个socket服务端&#xff0c;监听socket通道&#xff0c;并打印出socket通道中的内容。 创建两个socket客户端&#xff0c;向socket服务端写入消息。 1.创建服务端 public class RedisServer {public static void m…

Linux服务器应急响应(上)

目录 介绍步骤 介绍 网页篡改&#xff0c;即攻击者故意篡改网络上传送的报文&#xff0c;通常以入侵系统并篡改数据、劫持网络连接或插入数据等形式进行。 网页篡改一般有明显式和隐藏式两种。明显式网页篡改指攻击者为炫耀自己的技术技巧&#xff0c;或表明自己的观点实施的网…