【问题标题】:Flatten List in LINQLINQ 中的扁平化列表
【发布时间】:2010-12-08 02:58:15
【问题描述】:

我有一个返回 IEnumerable<List<int>> 的 LINQ 查询,但我只想返回 List<int>,所以我想将我在 IEnumerable<List<int>> 中的所有记录合并到一个数组中。

例子:

IEnumerable<List<int>> iList = from number in
    (from no in Method() select no) select number;

我想将我的所有结果 IEnumerable&lt;List&lt;int&gt;&gt; 仅用于一个 List&lt;int&gt;

因此,从源数组: [1,2,3,4][5,6,7]

我只想要一个数组 [1,2,3,4,5,6,7]

谢谢

【问题讨论】:

    标签: c# linq list


    【解决方案1】:

    试试SelectMany()

    var result = iList.SelectMany( i => i );
    

    【讨论】:

    • 谢谢,我总是忘记这个——我知道它在那里,但每次我需要使用它时,我都会花太多时间在谷歌上搜索它。将此答案加入书签。 :-)
    • 有一段时间我害怕我是唯一需要这个的人。谢谢迈克!
    • SelectMany( i =&gt; i ) 是否有一些替代语法?我已经看到这种语法使用了很多,但它似乎是对 select 功能的退化使用,所以我希望语言设计者能够专门为列表列表提供一种快捷语法
    【解决方案2】:

    使用查询语法:

    var values =
    from inner in outer
    from value in inner
    select value;
    

    【讨论】:

    • 感谢我一直在寻找的确切语法,这么多的答案列出了其他更详细的内容。
    • 这比 SelectMany 好得多。更清楚 IMO 发生了什么,感谢您指出这一点!
    • 就个人而言,我总是发现查询语法版本远不如方法调用版本直观。当 Resharper 提供将循环转换为 LINQ 表达式时,如果它给了我查询语法,我总是会撤消。
    【解决方案3】:
    iList.SelectMany(x => x).ToArray()
    

    【讨论】:

    • @recursive 其他人错过了什么? .ToArray()? -- 这是一种间接的情况 -- 如果您只需要迭代一次 -- 或者如果项目可能会更改,那么 .ToArray() 绝对不是您想要的。但是对于要枚举多次的静态项目,.ToList().ToArray() 将提高性能(代价是内存使用量稍高,这通常是一笔不错的交易)。
    • 大概在这种情况下需要数组,因为问题中已指定。
    • @recursive,如果我们在吹毛求疵,OP 说他需要返回List&lt;int&gt;,所以.ToList() 将是正确的选择。
    • @MEMark OP 还声明“仅对一个数组”
    【解决方案4】:

    如果你有List&lt;List&lt;int&gt;&gt; k,你可以这样做

    List<int> flatList= k.SelectMany( v => v).ToList();
    

    【讨论】:

      【解决方案5】:

      像这样?

      var iList = Method().SelectMany(n => n);
      

      【讨论】:

        猜你喜欢
        • 2016-01-14
        • 1970-01-01
        • 2016-03-28
        • 2021-11-19
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        相关资源
        最近更新 更多