【问题标题】:How to combine 2 lists using LINQ?如何使用 LINQ 组合 2 个列表?
【发布时间】:2011-01-26 08:07:40
【问题描述】:

环境:.NET4 C#

大家好,

我想合并这两个列表:{ "A", "B", "C", "D" }{ "1", "2", "3" }

进入这个:

{ "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3", "D1", "D2", "D3" }

显然,我可以使用嵌套循环。但我想知道 LINQ 是否可以提供帮助。 据我了解,Zip() 在这种情况下不是我的朋友,对吧?

TIA,

【问题讨论】:

  • 通常在 LINQ 中开始这样的事情时,询问“如果这些是数据库中的表,我将如何做”是有益的

标签: c# .net linq .net-4.0


【解决方案1】:

当您想形成两个列表的笛卡尔积时,请使用 SelectMany:

aList.SelectMany(a => bList.Select(b => a + b))

【讨论】:

  • 这太优雅了!这就是我喜欢 LINQ 的原因!
  • 我喜欢这个,但是想合并两个集合,比较像SQL select t1,t2,所以稍微修改一下就变成了aList.SelectMany(a => bList.Select(b => new {a , b}))
【解决方案2】:

本质上,您想要生成一个笛卡尔积,然后连接每个 2 元组的元素。这在查询语法中最容易做到:

var cartesianConcat = from a in seq1
                      from b in seq2
                      select a + b;

【讨论】:

  • 正如 Jon 指出的那样,* 我 * 发现这个答案在(撰写本文时)3 中最易读。实际上,它匹配我们在没有 LINQ 的情况下使用的嵌套循环,其他人可能会采用作为不选择此答案的论据。但是,当然,我希望能够将 3 个答案标记为已接受:-)
【解决方案3】:

SelectMany 绝对是正确的方法,无论是使用多个“from”子句还是直接调用,但这里是 Hightechrider 使用它的替代方法:

var result = aList.SelectMany(a => bList, (a, b) => a + b);

我个人觉得这更容易理解,因为它更接近于“multiple from”版本:对于“aList”中的每个“a”,我们生成一个新序列——在这种情况下它总是“bList”。对于笛卡尔连接产生的每个 (a, b) 对,我们投影到一个结果,该结果只是两者的串联。

要明确一点:这两种方法都可以。我只是更喜欢这个:)

至于这是否比查询表达式语法更清晰......我不确定。我通常在仅使用单个运算符的情况下使用方法调用,但对于JoinGroupJoinSelectManyGroupBy,查询表达式确实简化了事情。两者都试一下,看看哪个更易读:)

【讨论】:

猜你喜欢
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多