如何使用LINQ组合2个列表?

Ser*_*ier 29 .net c# linq .net-4.0

环境:.NET4 C#

大家好,

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

进入这一个:

{ "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3", "D1", "D2", "D3" }
Run Code Online (Sandbox Code Playgroud)

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

TIA,

Ian*_*cer 59

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

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


Ani*_*Ani 37

基本上,您希望生成笛卡尔积,然后连接每个2元组的元素.这在查询语法中最容易做到:

var cartesianConcat = from a in seq1
                      from b in seq2
                      select a + b;
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 25

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

var result = aList.SelectMany(a => bList, (a, b) => a + b);
Run Code Online (Sandbox Code Playgroud)

我个人觉得这更容易理解,因为它更接近"多个来自"版本:对于"aList"中的每个"a",我们产生一个新的序列 - 在这种情况下,它总是"bList".对于由笛卡尔连接产生的每个(a,b)对,我们投射到的结果只是两者的串联.

需要明确的是:两种方法都有效.我只是喜欢这一个:)

至于这是否比查询表达式语法更清楚......我不确定.我平时使用的时候,它只是使用单个运营商的情况下,方法调用,但是Join,GroupJoin,SelectManyGroupBy,查询表达式做事情简单化.尝试两者,看看发现哪些更具可读性:)

  • 嘿乔恩,一直想问,你多久一次?:) (9认同)
  • @The_Butcher:http://meta.stackexchange.com/questions/555/why-does-jon-skeet-never-sleep/566#566 (2认同)