數據如下:
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;
}
}