环境:.NET4 C#
大家好,
我想把这两个列表合并成一个:{ "A", "B", "C", "D", "1", "2", "3" }
{ "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3", "D1", "D2", "D3" }
显然,我可以使用嵌套循环。但我想知道LINQ是否能够帮助我。 就我所了解的,Zip()在这种情况下不适用,对吧?
TIA,
环境:.NET4 C#
大家好,
我想把这两个列表合并成一个:{ "A", "B", "C", "D", "1", "2", "3" }
{ "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3", "D1", "D2", "D3" }
显然,我可以使用嵌套循环。但我想知道LINQ是否能够帮助我。 就我所了解的,Zip()在这种情况下不适用,对吧?
TIA,
当你想要形成两个列表的笛卡尔积时,请使用SelectMany:
aList.SelectMany(a => bList.Select(b => a + b))
本质上,你想生成一个笛卡尔积,然后连接每个2元组的元素。最简单的方法是使用查询语法:
var cartesianConcat = from a in seq1
from b in seq2
select a + b;
SelectMany
绝对是正确的方法,无论是使用多个"from"子句还是直接调用,但这里有一种替代Hightechrider使用它的方法:
var result = aList.SelectMany(a => bList, (a, b) => a + b);
我个人认为这种写法更容易理解,因为它更接近“多重来源”版本:对于“aList”中的每个“a”,我们都会产生一个新的序列 - 在这种情况下,它始终是“bList”。对于由笛卡尔积产生的每个(a,b)对,我们将其投影到一个结果中,该结果只是两个序列的连接。
只是为了明确起见:这两种方法都可以工作。我只是更喜欢这种方式 :)
至于这是否比查询表达式语法更清晰......我不确定。当只涉及使用单个运算符时,我通常使用方法调用,但对于Join、GroupJoin、SelectMany和GroupBy,查询表达式确实简化了事情。尝试一下两种方法,看看哪种更容易阅读 :)