2009-04-23 26 views
5

如何加入2個相等長度的列表(生成等長的第3個列表),我不想指定一個條件,而僅僅依賴項目的順序2個列表。按順序加入2個列表而不是LINQ中的條件

如我怎樣才能加入:

{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」。

回答

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]}); 
+0

出色答卷。 +1 – 2009-04-23 23:27:34

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}; 

這種方案的好處是,它不會,如果名單有不同的長度,失敗,因爲使用索引會做的解決方案。

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});