使用LINQ按顺序而非条件连接2个列表

5

我应该如何将两个等长的列表合并(生成一个等长的第三个列表),而不需要指定条件,只是依赖于这两个列表中项目的顺序。

例如,我应该如何合并:

{1,2,3,4} with {5,6,7,8}

生产:

{{1,5}, {2,6}, {3,7}, {4,8}}

我尝试了以下方法:
from i in new []{1,2,3,4}
from j in new []{5,6,7,8}
select new { i, j }

但这会产生一个交叉连接。当我使用join时,我总是需要指定“on”。

3个回答

15
你可以在第一个列表中使用 Select,使用项目索引并访问第二个列表中的元素:
var a = new [] {1,2,3,4};
var b = new [] {5,6,7,8};

var qry = a.Select((i, index) => new {i, j = b[index]}); 

5
如果您使用的是 .Net 4.0 版本,您可以使用 Zip 扩展方法和元组。
var a = new [] {1,2,3,4};
var b = new [] {5,6,7,8};

var result = a.Zip(b, (an, bn) => Tuple.Create(an, bn));

或者,您可以将它们保留为数组:

var resultArr = a.Zip(b, (an, bn) => new []{an, bn});

0

如果你想使用查询语法,有一种折中的解决方案。这种方法是需要在两个列表上使用Select方法,以获取你将在where子句中使用的索引。

int[] list1 = {1,2,3,4};
int[] list2 = {5,6,7,8};

var result = from item1 in list1.Select((value, index) => new {value, index})
             from item2 in list2.Select((value, index) => new {value, index})
             where item1.index == item2.index
             select new {Value1 = item1.value, Value2 = item2.value};

使用此解决方案的好处在于,如果列表长度不同,它不会像使用索引器的解决方案那样失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接