首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#排序父/子列表以生成平面输出

C#排序父/子列表以生成平面输出
EN

Stack Overflow用户
提问于 2020-02-20 21:18:04
回答 3查看 445关注 0票数 2

我有这样的模型:

代码语言:javascript
复制
public class Node 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
}

我有来自数据库查询的以下数据:

代码语言:javascript
复制
        nodes.Add(new Node { Id = 1, Name = "Node #1", ParentId = null });
        nodes.Add(new Node { Id = 2, Name = "Node #2", ParentId = 1 });
        nodes.Add(new Node { Id = 3, Name = "Node #3", ParentId = 2 });
        nodes.Add(new Node { Id = 4, Name = "Node #4", ParentId = null });
        nodes.Add(new Node { Id = 5, Name = "Node #5", ParentId = 2 });
        nodes.Add(new Node { Id = 6, Name = "Node #6", ParentId = 2 });
        nodes.Add(new Node { Id = 7, Name = "Node #7", ParentId = 1 });
        nodes.Add(new Node { Id = 8, Name = "Node #8", ParentId = 5 });
        nodes.Add(new Node { Id = 9, Name = "Node #9", ParentId = 4 });
        nodes.Add(new Node { Id = 10, Name = "Node #10", ParentId = 4 });

我想对清单进行排序,并保持平房结构。我期望的输出是:

代码语言:javascript
复制
        // 1  - Node #1  => NULL
        // 2  - Node #2  => 1
        // 3  - Node #3  => 2
        // 5  - Node #5  => 2
        // 8  - Node #8  => 5
        // 6  - Node #6  => 2
        // 7  - Node #7  => 1
        // 4  - Node #4  => NULL
        // 9  - Node #9  => 4
        // 10 - Node #10 => 4

我指的是这个Stackoverflow answer,但是我没有得到我想要的结果。

有什么帮助吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-20 22:03:11

我会这样做:

代码语言:javascript
复制
var nodes = new List<Node>()
{
    new Node { Id = 1, Name = "Node #1", ParentId = null },
    new Node { Id = 2, Name = "Node #2", ParentId = 1 },
    new Node { Id = 3, Name = "Node #3", ParentId = 2 },
    new Node { Id = 4, Name = "Node #4", ParentId = null },
    new Node { Id = 5, Name = "Node #5", ParentId = 2 },
    new Node { Id = 6, Name = "Node #6", ParentId = 2 },
    new Node { Id = 7, Name = "Node #7", ParentId = 1 },
    new Node { Id = 8, Name = "Node #8", ParentId = 5 },
    new Node { Id = 9, Name = "Node #9", ParentId = 4 },
    new Node { Id = 10, Name = "Node #10", ParentId = 4 },
};

var lookup = nodes.ToLookup(x => x.ParentId);

IEnumerable<Node> Flatten(int? parentId)
{
    foreach (var node in lookup[parentId])
    {
        yield return node;
        foreach (var child in Flatten(node.Id))
        {
            yield return child;
        }
    }   
}

var output = Flatten(null).ToArray();

这个小小的递归给了我:

票数 3
EN

Stack Overflow用户

发布于 2020-02-20 21:52:16

您可以尝试使用SelectMany创建LINQ中的递归查询,如下所示:

代码语言:javascript
复制
IEnumerable<Node> Recurcive(List<Node> nodeList, int? parentId)
{
    return nodeList
        .Where(x => x.ParentId == parentId)
        .SelectMany(x =>
                  new[] { new Node
                    { Id = x.Id, Name = x.Name, ParentId = x.ParentId } }
                        .Concat(Recurcive(nodeList, x.Id)));
}

foreach (var node in Recurcive(nodes, null))
    Console
     .WriteLine($"Id : {node.Id}\t, Name = {node.Name}\t, Parent = {node.ParentId}");

输出:

代码语言:javascript
复制
//Id: 1  , Name = Node #1        , Parent =
//Id: 2  , Name = Node #2        , Parent = 1
//Id: 3  , Name = Node #3        , Parent = 2
//Id: 5  , Name = Node #5        , Parent = 2
//Id: 8  , Name = Node #8        , Parent = 5
//Id: 6  , Name = Node #6        , Parent = 2
//Id: 7  , Name = Node #7        , Parent = 1
//Id: 4  , Name = Node #4        , Parent =
//Id: 9  , Name = Node #9        , Parent = 4
//Id: 10 , Name = Node #10       , Parent = 4
票数 0
EN

Stack Overflow用户

发布于 2020-02-20 22:02:53

我想你想要这个

代码语言:javascript
复制
 nodes.OrderBy(n => n.ParentID ?? n.Id)
      .ThenBy(n => n.Id);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60328643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档