使用 Linq 来展平嵌套列表而不是 foreach 循环

Joh*_*ara 5 c# linq asp.net

我有一个经常性的课程 - 我在下面简化了它。

public class SiloNode
{
    public string Key { get; private set; }
    public string Url { get; private set; }
    public List<SiloNode> Children { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

尽管从理论上讲,它可以永远嵌套,但节点只会向下两层。因此,顶级节点可以有子节点,但子节点不能有子节点。

我有一个主列表,其中包含所有顶级节点及其嵌套子节点。

但是,我需要将所有节点放入一个平面列表中 - 节点 1,然后是它的子节点,然后是节点 2 等。

我在这方面的知识有限,但我可以做一些事情,比如foreach遍历主列表并创建一个新列表,如下所示:

public IEnumerable<SiloNode> GetLinks(IEnumerable<SiloNode> masterList)
{
    var newList = new List<SiloNode>();

    foreach (var node in masterList)
    {
        newList.Add(node);
        newList.AddRange(node.Children);
    }

    return newList;
}
Run Code Online (Sandbox Code Playgroud)

但是,我知道可能有更好的方法,但我只是不知道如何将其转换foreachLinq执行相同操作的语句。换句话说,一起选择父项及其子项。

任何帮助表示赞赏。

Tim*_*ter 5

您可以使用SelectMany,只需连接单亲及其孩子:

List<SiloNode> newList = masterList.SelectMany(n => new[]{ n }.Concat(n.Children)).ToList();
Run Code Online (Sandbox Code Playgroud)