C#根據Id和ParentId生成樹

數據如下:

List<Node> nodes = new List<Node>();
nodes.Add(new Node() { Id = 1, Name = "中國", ParentId = 0 });
nodes.Add(new Node() { Id = 2, Name = "浙江省", ParentId = 1 });
nodes.Add(new Node() { Id = 3, Name = "杭州市", ParentId = 2 });
nodes.Add(new Node() { Id = 4, Name = "湖州市", ParentId = 2 });
nodes.Add(new Node() { Id = 5, Name = "拱墅區", ParentId = 3 });
nodes.Add(new Node() { Id = 6, Name = "西湖區", ParentId = 3 });
nodes.Add(new Node() { Id = 7, Name = "濱江區", ParentId = 3 });
nodes.Add(new Node() { Id = 8, Name = "吳興區", ParentId = 4 });
nodes.Add(new Node() { Id = 9, Name = "南潯區", ParentId = 4 });
nodes.Add(new Node() { Id = 10, Name = "長興縣", ParentId = 4 });

現在需要根據Id和ParentId的從屬關係生成一棵JSON樹,以便供前端表格控件調用,樹結構如下所示:

[
  {
    "Children": [
      {
        "Children": [
          {
            "Children": [
              {
                "Children": [],
                "Id": 5,
                "ParentId": 3,
                "Name": "拱墅區"
              },
              {
                "Children": [],
                "Id": 6,
                "ParentId": 3,
                "Name": "西湖區"
              },
              {
                "Children": [],
                "Id": 7,
                "ParentId": 3,
                "Name": "濱江區"
              }
            ],
            "Id": 3,
            "ParentId": 2,
            "Name": "杭州市"
          },
          {
            "Children": [
              {
                "Children": [],
                "Id": 8,
                "ParentId": 4,
                "Name": "吳興區"
              },
              {
                "Children": [],
                "Id": 9,
                "ParentId": 4,
                "Name": "南潯區"
              },
              {
                "Children": [],
                "Id": 10,
                "ParentId": 4,
                "Name": "長興縣"
              }
            ],
            "Id": 4,
            "ParentId": 2,
            "Name": "湖州市"
          }
        ],
        "Id": 2,
        "ParentId": 1,
        "Name": "浙江省"
      }
    ],
    "Id": 1,
    "ParentId": 0,
    "Name": "中國"
  }
]

代碼如下所示:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Node> nodes = new List<Node>();
            nodes.Add(new Node() { Id = 1, Name = "中國", ParentId = 0 });
            nodes.Add(new Node() { Id = 2, Name = "浙江省", ParentId = 1 });
            nodes.Add(new Node() { Id = 3, Name = "杭州市", ParentId = 2 });
            nodes.Add(new Node() { Id = 4, Name = "湖州市", ParentId = 2 });
            nodes.Add(new Node() { Id = 5, Name = "拱墅區", ParentId = 3 });
            nodes.Add(new Node() { Id = 6, Name = "西湖區", ParentId = 3 });
            nodes.Add(new Node() { Id = 7, Name = "濱江區", ParentId = 3 });
            nodes.Add(new Node() { Id = 8, Name = "吳興區", ParentId = 4 });
            nodes.Add(new Node() { Id = 9, Name = "南潯區", ParentId = 4 });
            nodes.Add(new Node() { Id = 10, Name = "長興縣", ParentId = 4 });

            List<Node> list = CreateTreeNodes(nodes);
            Console.WriteLine(JsonConvert.SerializeObject(list, Formatting.Indented));
            Console.ReadKey(true);
        }

        // 生成樹
        static List<Node> CreateTreeNodes(List<Node> nodes)
        {
            List<Node> root = nodes.FindAll(node => node.ParentId == 0);
            return SortNodes(nodes, root);
        }

        // 遞歸分組
        static List<Node> SortNodes(List<Node> nodes, List<Node> root)
        {
            for (int i = 0; i < root.Count; i++)
            {
                List<Node> children = nodes.FindAll(node => node.ParentId == root[i].Id);
                SortNodes(nodes, children);
                root[i].Children = children;
            }
            return root;
        }
    }

    public class Node
    {
        /// <summary>
        /// 編號
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// 上一級編號
        /// </summary>
        public int ParentId { get; set; }

        /// <summary>
        /// 名稱
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 子節點
        /// </summary>
        public List<Node> Children;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章