C#中通过递归获取所有的子分类

这篇具有很好参考价值的文章主要介绍了C#中通过递归获取所有的子分类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章将和大家分享C#中如何通过递归获取所有的子分类。废话不多说,我们直接来看一下Demo,如下所示:

递归写法如下:

using System;
using System.Collections.Generic;
using System.Linq;

namespace RecursionDemo
{
    /// <summary>
    /// 树节点
    /// </summary>
    public class TreeNode
    {
        /// <summary>
        /// 节点Id
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 节点名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 父节点Id
        /// </summary>
        public int ParentId { get; set; }

        /// <summary>
        /// 子节点
        /// </summary>
        public List<TreeNode> Children { get; set; }
    }

    /// <summary>
    /// 树节点业务逻辑
    /// </summary>
    public class TreeNodeBLL
    {
        /// <summary>
        /// 通过递归获取所有子孙节点
        /// </summary>
        /// <param name="parentId">父节点Id</param>
        /// <param name="listAllTreeNode">所有节点数据</param>
        /// <returns>返回所有子孙节点</returns>
        public List<TreeNode> GetChildren(int parentId, List<TreeNode> listAllTreeNode)
        {
            var listResult = new List<TreeNode>(); //存放返回结果的集合
            var listChildren = listAllTreeNode.FindAll(node => node.ParentId == parentId);
            if (listChildren.Count <= 0)
            {
                //此处是返回 null 值,还是要返回 listResult ,则需要根据具体的业务逻辑来决定
                return null; //return listResult;
            }

            //遍历指定parentId下的第一级子节点
            foreach (var item in listChildren)
            {
                var childNode = new TreeNode();
                childNode.Id = item.Id;
                childNode.Name = item.Name;
                childNode.ParentId = item.ParentId;
                childNode.Children = GetChildren(item.Id, listAllTreeNode); //递归获取子节点下的子节点
                listResult.Add(childNode);
            }

            return listResult;
        }

        /// <summary>
        /// 初始化级联数据(用于演示)
        /// </summary>
        /// <returns></returns>
        public List<TreeNode> InitData()
        {
            //级联数据,此处以省市区级联数据为例
            var listAllTreeNode = new List<TreeNode>() {
                new TreeNode() {
                    Id = 1,
                    ParentId = 0,
                    Name = "福建省"
                },
                new TreeNode() {
                    Id = 2,
                    ParentId = 0,
                    Name = "上海市"
                },
                new TreeNode()
                {
                    Id = 3,
                    ParentId = 1,
                    Name = "福州市"
                },
                new TreeNode()
                {
                    Id = 4,
                    ParentId = 1,
                    Name = "厦门市"
                },
                new TreeNode()
                {
                    Id = 5,
                    ParentId = 3,
                    Name = "永泰县"
                },
                new TreeNode()
                {
                    Id = 6,
                    ParentId = 2,
                    Name = "黄浦"
                },
                new TreeNode()
                {
                    Id = 7,
                    ParentId = 2,
                    Name = "虹口"
                },
                new TreeNode()
                {
                    Id = 8,
                    ParentId = 2,
                    Name = "宝山"
                }
            };
            return listAllTreeNode;
        }
    }
}

调用如下:

using Newtonsoft.Json;

namespace RecursionDemo
{
    /// <summary>
    /// 递归Demo
    /// </summary>
    internal class Program
    {
        static void Main(string[] args)
        {
            //示例1:C#中通过递归获取所有的子分类
            var treeNodeBLL = new TreeNodeBLL();
            var listAllTreeNode = treeNodeBLL.InitData();
            var childrenNode = treeNodeBLL.GetChildren(0, listAllTreeNode);
            var childrenNodeJson = JsonConvert.SerializeObject(childrenNode); //序列化成Json字符串
            Console.WriteLine(childrenNodeJson);

            //换行
            Console.WriteLine();

            //示例2:求 斐波那契数列 第n项是多少?(通过递归方式获取)
            int n = 8; //第8项
            int result = GetFibonacciSequence(n);
            Console.WriteLine(string.Format(@"斐波那契数列 第{0}项是:{1}", n, result));
            Console.ReadKey();
        }

        /// <summary>
        /// 获取 斐波那契数列 第n项的值 (通过递归方式获取)
        /// </summary>
        /// <param name="n">第n项</param>
        /// <returns>第n项的值</returns>
        static int GetFibonacciSequence(int n)
        {
            //斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89...
            //这个数列从第3项开始,每一项都等于前两项之和。
            if (n < 3)
            {
                return 1;
            }

            return GetFibonacciSequence(n - 1) + GetFibonacciSequence(n - 2); //通过递归获取前两项之和
        }
    }
}

运行结果如下所示:

C#中通过递归获取所有的子分类

其中 childrenNodeJson 值格式化后结果如下所示:

[
    {
        "Id":1,
        "Name":"福建省",
        "ParentId":0,
        "Children":[
            {
                "Id":3,
                "Name":"福州市",
                "ParentId":1,
                "Children":[
                    {
                        "Id":5,
                        "Name":"永泰县",
                        "ParentId":3,
                        "Children":null
                    }
                ]
            },
            {
                "Id":4,
                "Name":"厦门市",
                "ParentId":1,
                "Children":null
            }
        ]
    },
    {
        "Id":2,
        "Name":"上海市",
        "ParentId":0,
        "Children":[
            {
                "Id":6,
                "Name":"黄浦",
                "ParentId":2,
                "Children":null
            },
            {
                "Id":7,
                "Name":"虹口",
                "ParentId":2,
                "Children":null
            },
            {
                "Id":8,
                "Name":"宝山",
                "ParentId":2,
                "Children":null
            }
        ]
    }
]

至此本文就全部介绍完了,如果觉得对您有所启发请记得点个赞哦!!!  

 

Demo源码:

链接:https://pan.baidu.com/s/16PpxARzJbwNUeU26hJi0MA 
提取码:sezs

此文由博主精心撰写转载请保留此原文链接:https://www.cnblogs.com/xyh9039/p/17419432.html

版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!文章来源地址https://www.toymoban.com/news/detail-453792.html

到了这里,关于C#中通过递归获取所有的子分类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# Windows API应用:获取桌面所有窗口句柄的方法

    C# Windows API应用:获取桌面所有窗口句柄的方法 在 C# 的 Windows 应用程序开发中,我们常常需要获取桌面上所有窗口的句柄,以便进行一些窗口管理或者后续操作。本文将介绍一种利用 Windows API 获取桌面所有窗口句柄的方法,并提供相应的源代码和描述。 在开始之前,我们需

    2024年02月05日
    浏览(34)
  • 通过Python+Selenium获取我的所有文章质量分

    大家好,我是空空star,本篇给大家分享一下 《通过Python+Selenium获取我的所有文章质量分》 。 目前在质量分查询界面只能一篇文章一篇文章查,如果我们想快速知道我们哪些文章质量分不是高质量,手动一篇一篇查太慢,借助Selenium代替手动,快速查出我们所有文章的质量分

    2024年02月16日
    浏览(27)
  • 二叉树算法思想和原理:介绍通过递归算法计算二叉树结点个数的基本思路及C#、C++代码示例

    二叉树是一种非常常见的数据结构,它由结点组成,每个结点最多有两个子结点,分别称为左子结点和右子结点。在二叉树中,每个结点都有一个数据域和一个指针域,指针域分别指向左子结点和右子结点。二叉树有很多种不同的类型,如满二叉树、完全二叉树、平衡二叉树

    2024年01月21日
    浏览(31)
  • 30. 串联所有单词的子串

    题目链接:30. 串联所有单词的子串 代码如下:

    2024年01月18日
    浏览(30)
  • C# 通过IP获取Mac地址(ARP)

    C# 通过IP获取Mac地址

    2024年02月03日
    浏览(36)
  • C# 通过 HttpWebRequest发送数据以及服务器通过Request请求获取数据

    C#中HttpWebRequest的用法详解 可参考: C#中HttpWebRequest的用法详解 C# HttpWebRequest详解 C# 服务器通过Request获取参数 可参考: C# WebService 接口 通过Request请求获取json参数 1、后台程序发送HTTP请求的Class,服务器端也要添加该类 2、服务端返回HTTP请求的数据class,客户端也要有 1、后台

    2024年02月06日
    浏览(43)
  • c#通过opcautomation获取opc服务器数据

    本代码是一个基于OPCAutomation的OPC连接程序,通过此程序可以连接OPC服务器并读取OPCItem的值。程序的主要功能包括: 连接到指定的OPC服务器 断开连接 读取指定OPCItem的值 定时读取OPCItem的值 暂停/继续读取OPCItem的值 程序使用了OPCAutomation库,在程序中实例化了OPCServer和OPCBrows

    2024年01月21日
    浏览(32)
  • 【算法】串联所有单词的子串【滑动窗口】

    滑动窗口

    2024年01月19日
    浏览(33)
  • 【Java刷题篇】串联所有单词的子串

    力扣链接: 串联所有单词的子串 阅读题目后,可以拿到一个关键信息– words中所有字符串长度相等 ,这后续解题思路的一大关键,还有就是串联字串的字符串顺序可以不同。得到这两个关键信息后,我们就很容易联想到运用 滑动窗口 这个算法来解决问题。 好分析完题目后,

    2024年03月22日
    浏览(34)
  • 【LeetCode:30. 串联所有单词的子串 | 滑动窗口 + 哈希表】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年01月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包