我如何加入2个相等长度的列表(以产生相等长度的第3个列表),其中我不想指定条件,而只是依赖于2个列表中的项目顺序。
例如我如何加入:
{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”。
答案 0 :(得分: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]});
答案 1 :(得分: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});
答案 2 :(得分: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};
这个解决方案的好处是,如果列表具有不同的长度,它不会失败,因为使用索引器的解决方案会这样做。