【1】说明
1.代码可一键复制 并运行(全部代码在最后)。
2.文章为结构式说明,分先后步骤。
3.此文章优先显示效果,如效果不符合个体需求,则无需继续查看。
【2】效果展示
[
{
"Id": 1,
"Name": "test",
"Pid": 0,
"Children": [
{
"Children": null,
"Id": 4,
"Name": "test3",
"Pid": 1
}
]
},
{
"Children": null,
"Id": 2,
"Name": "test1",
"Pid": 0
},
{
"Children": null,
"Id": 3,
"Name": "test3",
"Pid": 0
}
]
一、原始数据结构以及树形数据结构
- 原始数据结构
class TreeModel
{
/// <summary>
/// id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 父id
/// </summary>
public string Pid { get; set; }
}
2.树形数据结构
class TreeStructure: TreeModel
{
/// <summary>
/// 子集数据
/// </summary>
public List<TreeStructure> Children { get; set; }
}
3.模拟数据
List<TreeModel> list = new List<TreeModel>();
list.Add(new TreeModel
{
Id = 1,
Name = "test",
Pid = 0,
});
list.Add(new TreeModel
{
Id = 4,
Name = "test3",
Pid = 1,
});
list.Add(new TreeModel
{
Id = 2,
Name = "test1",
Pid = 0,
});
list.Add(new TreeModel
{
Id = 3,
Name = "test3",
Pid = 0,
});
二、递归方法
1.处理递归-最父级数据
//公用递归(处理递归最父级数据)
List<TreeStructure> OperationParentData(List<TreeModel> treeDataList, int parentId)
{
var data = treeDataList.Where(x => x.Pid == parentId);//父级数据
List<TreeStructure> list = new List<TreeStructure>();//树形
foreach (var item in data)
{
TreeStructure nodeData = new TreeStructure();
nodeData.Id = item.Id;
nodeData.Pid = item.Pid;
nodeData.Name = item.Name;
OperationChildData(treeDataList, nodeData);
list.Add(nodeData);
}
return list;
}
2.处理递归-递归子级数据
/// <summary>
/// 公用递归(递归子级数据)
/// </summary>
void OperationChildData(List<TreeModel> treeDataList, TreeStructure parentItem)
{
var subItems = treeDataList.Where(ee => ee.Pid == parentItem.Id).ToList();//子集数据
if (subItems.Count != 0)
{
parentItem.Children = new List<TreeStructure>();
foreach (var item in subItems)
{
TreeStructure nodeData = new TreeStructure();
nodeData.Id = item.Id;
nodeData.Pid = item.Pid;
nodeData.Name = item.Name;
parentItem.Children.Add(nodeData);
}
foreach (var subItem in subItems)
{
TreeStructure nodeData = new TreeStructure();
nodeData.Id = subItem.Id;
nodeData.Pid = subItem.Pid;
nodeData.Name = subItem.Name;
OperationChildData(treeDataList, nodeData);
}
}
}
2.执行-调用递归
var data = OperationParentData(list, 0);//调用递归
var jsona = JsonSerializer.Serialize(data);//序列化
var dat1a = "";//断点处
三、全部代码(控制台运行)
// See https://aka.ms/new-console-template for more information
using System.Net.Http.Json;
using System.Text.Json;
using System.Text.Json.Serialization;
Console.WriteLine("Hello, World!");
List<TreeModel> list = new List<TreeModel>();
list.Add(new TreeModel
{
Id = 1,
Name = "test",
Pid = 0,
});
list.Add(new TreeModel
{
Id = 4,
Name = "test3",
Pid = 1,
});
list.Add(new TreeModel
{
Id = 2,
Name = "test1",
Pid = 0,
});
list.Add(new TreeModel
{
Id = 3,
Name = "test3",
Pid = 0,
});
var data = OperationParentData(list, 0);//调用递归
var jsona = JsonSerializer.Serialize(data);//序列化
var dat1a = "";//断点处
//公用递归(处理递归最父级数据)
List<TreeStructure> OperationParentData(List<TreeModel> treeDataList, int parentId)
{
var data = treeDataList.Where(x => x.Pid == parentId);//父级数据
List<TreeStructure> list = new List<TreeStructure>();//树形
foreach (var item in data)
{
TreeStructure nodeData = new TreeStructure();
nodeData.Id = item.Id;
nodeData.Pid = item.Pid;
nodeData.Name = item.Name;
OperationChildData(treeDataList, nodeData);
list.Add(nodeData);
}
return list;
}
/// <summary>
/// 公用递归(递归子级数据)
/// </summary>
void OperationChildData(List<TreeModel> treeDataList, TreeStructure parentItem)
{
var subItems = treeDataList.Where(ee => ee.Pid == parentItem.Id).ToList();//子集数据
if (subItems.Count != 0)
{
parentItem.Children = new List<TreeStructure>();
foreach (var item in subItems)
{
TreeStructure nodeData = new TreeStructure();
nodeData.Id = item.Id;
nodeData.Pid = item.Pid;
nodeData.Name = item.Name;
parentItem.Children.Add(nodeData);
}
foreach (var subItem in subItems)
{
TreeStructure nodeData = new TreeStructure();
nodeData.Id = subItem.Id;
nodeData.Pid = subItem.Pid;
nodeData.Name = subItem.Name;
OperationChildData(treeDataList, nodeData);
}
}
}
class TreeModel
{
/// <summary>
/// id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 父id
/// </summary>
public int Pid { get; set; }
}
class TreeStructure: TreeModel
{
/// <summary>
/// 子集数据
/// </summary>
public List<TreeStructure> Children { get; set; }
}