c# Linq 递归树形结构

【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
    }
]

一、原始数据结构以及树形数据结构

  1. 原始数据结构
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; }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容