c# - 使用 Linq 展平嵌套列表而不是 foreach 循环

标签 c# asp.net linq

我有一个循环类(class) - 我在下面对其进行了简化。

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

尽管理论上它可以永远嵌套,但节点只会下降两层。所以,顶级节点可以有 child ,但 child 不能有 child 。

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

但是,我需要将所有节点放入一个平面列表中 - 节点 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,只需连接单亲及其 child :

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

关于c# - 使用 Linq 展平嵌套列表而不是 foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52187650/

相关文章:

c# - WPF - 在文本框外部单击时移除焦点

c# - 结构数组 - 数组元素是引用类型还是值类型?

c# - 有没有 ePub 的库

c# - 语音识别引擎 : UnloadAllGrammars is VERY slow

c# - Silverlight AutoCompleteBox 大写输入

c# - ASP.Net MVC 存储在资源中或作为内容

asp.net - 无法将本地托管应用程序中的数据插入 Appharbor MySQL 数据库(超时异常)

c# - 检查两个列表是否相等

c# - 更新 IEnumerable<> 中的对象不更新?

c# - 如何重置 C# 中的标识列?