环境:.NET4 C#
大家好,
我想结合这两个列表:{ "A", "B", "C", "D" }
和{ "1", "2", "3" }
进入这一个:
{ "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3", "D1", "D2", "D3" }
显然,我可以使用嵌套循环。但我想知道LINQ是否可以提供帮助。 据我所知,在这种情况下,Zip()不是我的朋友,对吗?
TIA,
答案 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)对,我们投射的结果只是两者的串联。
请注意:两种方法都有效。我只是喜欢这个:)
至于这是否比查询表达式语法更清晰......我不确定。我通常使用方法调用只是一个使用单个运算符的情况,但对于Join
,GroupJoin
,SelectMany
和GroupBy
,查询表达式确实简化了事情尝试两者,看看你哪个更易读:)