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

时间:2011-01-26 08:07:41

标签: c# .net 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" }

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

TIA,

3 个答案:

答案 0 :(得分:59)

如果要形成两个列表的笛卡尔积,请使用SelectMany:

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

答案 1 :(得分:37)

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

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

答案 2 :(得分:25)

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

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

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

请注意:两种方法都有效。我只是喜欢这个:)

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

相关问题