我有一个定期上课的课程-我在下面进行了简化。

public class SiloNode
{
    public string Key { get; private set; }
    public string Url { get; private set; }
    public List<SiloNode> Children { get; private set; }
}


尽管从理论上讲,它可以永远嵌套,但节点只会下降两个级别。因此,顶级节点可以有一个孩子,但是一个孩子不能有孩子。

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

但是,我需要将所有节点放入一个平面列表中-节点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;
}


但是,我知道可能有更好的方法,但是我无法弄清楚如何将foreach转换为将执行相同操作的Linq语句。换句话说,一起选择父级及其子级。

任何帮助表示赞赏。

最佳答案

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

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

08-26 16:22