C#将列表转换为树状结构

C#将列表转换为树状结构,c#,data-structures,tree,C#,Data Structures,Tree,在我的ASP.NET应用程序中,我希望将中的对象列表转换为树状结构(即连接其相应父节点下的每个叶节点)。我尝试过这一点,但没有得到想要的结构: public class CVBoxController : ApiController { public async Task<HttpResponseMessage> GetCategories() { var categories = new List<CategoriesList>

在我的ASP.NET应用程序中,我希望将中的对象列表转换为树状结构(即连接其相应父节点下的每个叶节点)。我尝试过这一点,但没有得到想要的结构:

public class CVBoxController : ApiController
{
    public async Task<HttpResponseMessage> GetCategories()
    {
        var categories = new List<CategoriesList>
            {
                new CategoriesList { Id=1, Name="Cat 01", ParentId=0 },
                new CategoriesList { Id=2, Name="Cat 02", ParentId=0 },
                new CategoriesList { Id=3, Name="Cat 03", ParentId=0 },
                new CategoriesList { Id=4, Name="Cat 04", ParentId=0 },
                new CategoriesList { Id=5, Name="Cat 05", ParentId=0 },
                new CategoriesList { Id=6, Name="Cat 06", ParentId=1 },
                new CategoriesList { Id=7, Name="Cat 07", ParentId=6 },
                new CategoriesList { Id=8, Name="Cat 08", ParentId=3 },
                new CategoriesList { Id=9, Name="Cat 09", ParentId=4 },
                new CategoriesList { Id=10, Name="Cat 10", ParentId=9 },
                new CategoriesList { Id=11, Name="Cat 11", ParentId=10 }
            };

        var response = CreateCategoryTree(categories);
        return Request.CreateResponse(HttpStatusCode.OK, response);
    }

    private List<CategoryNode> CreateCategoryTree(List<CategoriesList> categories)
    {
        List<CategoryNode> nodes = new List<CategoryNode>();

        foreach (var item in categories)
        {
            if (item.ParentId == 0)
                nodes.Add(new CategoryNode { Id = item.Id, Name = item.Name });
            else
            {
                CreateNode(nodes, item);
            }
        }
        return nodes;
    }

    private void CreateNode(List<CategoryNode> nodes, CategoriesList parent)
    {
        foreach (var node in nodes)
        {
            if (node.Id == parent.Id)
            {
                node.Children.Add(new CategoryNode { Id = parent.Id, Name = parent.Name });
            }
            else
            {
                CreateNode(node.Children, parent);
            }
        }
    }
}

public class CategoriesList
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int ParentId { get; set; }
}

public class CategoryNode
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<CategoryNode> Children { get; set; }

    public CategoryNode()
    {
        Children = new List<CategoryNode>();
    }
}

正如您所看到的,JSON没有嵌套(未填充子项)。它应该根据上面的
列表中填充的内容
ParentId=0
表示这些是上面没有父节点的根节点。

好的,您的问题就在这里,这是参数命名混乱的症状:

private void CreateNode(List<CategoryNode> nodes, CategoriesList parent)
{
    foreach (var node in nodes)
    {
        if (node.Id == parent.Id)
        {
            node.Children.Add(new CategoryNode { Id = parent.Id, Name = parent.Name });
        }
        else
        {
            CreateNode(node.Children, parent);
        }
    }
}
不可能是真的。因为您为节点添加了
Id
与您要添加的项目匹配的节点,所以尚未添加该节点!
节点
中没有与正在添加的项目的
Id
匹配的
节点
(除非您的列表可以包含重复的Id,我假设不是这样)

应该是这样的:

if (node.Id == parent.ParentId)
如果您将第二个参数命名为
CreateNode
,类似于
item
newNode
,或者除
parent
之外的任何其他参数,则不会让您绊倒


下面是一个似乎工作正常的方法。

好的,您的问题就在这里,这是您的参数命名混乱的症状:

private void CreateNode(List<CategoryNode> nodes, CategoriesList parent)
{
    foreach (var node in nodes)
    {
        if (node.Id == parent.Id)
        {
            node.Children.Add(new CategoryNode { Id = parent.Id, Name = parent.Name });
        }
        else
        {
            CreateNode(node.Children, parent);
        }
    }
}
不可能是真的。因为您为节点添加了
Id
与您要添加的项目匹配的节点,所以尚未添加该节点!
节点
中没有与正在添加的项目的
Id
匹配的
节点
(除非您的列表可以包含重复的Id,我假设不是这样)

应该是这样的:

if (node.Id == parent.ParentId)
如果您将第二个参数命名为
CreateNode
,类似于
item
newNode
,或者除
parent
之外的任何其他参数,则不会让您绊倒


下面是一个似乎工作正常的方法。

“我已经尝试过了,但没有得到所需的结构”您得到了什么?你期待什么?我需要前端TreeView的JSON。你现在有什么?你的代码产生了什么?为什么错了呢?在问题本身,而不是评论中贴出来。不要让人们猜测好吧——那么问题是孩子们没有人居住?如果这从一开始就在问题中,那会很有帮助。“帮助我们来帮助你。”我试过了,但没有得到想要的结构“你得到了什么?你期待什么?我需要前端TreeView的JSON。你现在有什么?你的代码产生了什么?为什么错了呢?在问题本身,而不是评论中贴出来。不要让人们猜测好吧——那么问题是孩子们没有人居住?如果这从一开始就在问题中,那会很有帮助。帮我们帮你,太棒了。非常感谢:-)嗨,你能回答这个问题吗:太棒了。非常感谢:-)嗨,你能回答这个问题吗