【.NET】【C#】自定义树的实现

文章描述了一个使用C#编写的控制台应用程序,通过递归算法生成树形结构,并将结果保存为JSON文件到桌面。核心是`Tree`类及其`Generate`方法,展示了如何创建树状数据结构并序列化为JSON。
摘要由CSDN通过智能技术生成

目录

项目预览

运行结果

项目代码

项目预览

新建控制台测试项目,在桌面上生成自定义树的json文件。

运行结果

桌面生成的tree.json文件

项目代码

using Newtonsoft.Json;

namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Tree.Test();
        }
    }

    /// <summary>
    /// 自定义树
    /// </summary>
    public class Tree
    {
        /// <summary>
        /// 根节点
        /// </summary>
        public TreeNode RootNode { get; set; }

        /// <summary>
        /// 通过节点列表生成一棵树
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public static Tree Generate(List<TreeNode> list)
        {
            foreach (var node1 in list)
            {
                foreach (var node2 in list)
                {
                    if (node1.Id == node2.PId)
                    {
                        node1.Children.Add(node2);
                    }
                }
            }

            var allIds = list.Select(x => x.Id).ToList();
            var rootNodeList = list.Where(x => !allIds.Contains(x.PId));
            if (rootNodeList.Count() == 1)
            {
                var tree = new Tree()
                {
                    RootNode = rootNodeList.First(),
                };
                return tree;
            }
            else
            {
                throw new Exception("根节点不唯一");
            }
        }

        /// <summary>
        /// 测试
        /// </summary>
        public static void Test()
        {
            var nodeList = new List<TreeNode>()
            {
                new TreeNode()
                {
                    Id = "0",
                    PId = "",
                    Text = "根",
                },
                new TreeNode()
                {
                    Id = "1",
                    PId = "0",
                    Text = "1",
                },
                new TreeNode()
                {
                    Id = "11",
                    PId = "1",
                    Text = "1-1",
                },
                new TreeNode()
                {
                    Id = "111",
                    PId = "11",
                    Text = "1-1-1",
                },
                new TreeNode()
                {
                    Id = "112",
                    PId = "11",
                    Text = "1-1-2",
                },
                new TreeNode()
                {
                    Id = "2",
                    PId = "0",
                    Text = "2",
                },
                new TreeNode()
                {
                    Id = "21",
                    PId = "2",
                    Text = "2-1",
                },
                new TreeNode()
                {
                    Id = "22",
                    PId = "2",
                    Text = "2-2",
                },
            };
            var res = Generate(nodeList);
            var json = JsonConvert.SerializeObject(res);
            File.WriteAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "tree.json"), json);
        }
    }

    /// <summary>
    /// 节点类
    /// </summary>
    public class TreeNode
    {
        public string Text { get; set; } = string.Empty;
        public string Id { get; set; } = string.Empty;
        public string PId { get; set; } = string.Empty;
        public List<TreeNode> Children { get; set; } = new List<TreeNode>();
    }
}
  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值