2009-12-13 81 views
4

如何修改版本2以產生與版本1相同的結果,因爲在版本2中,我是 獲取cretesian產品。Linq - 如何組合兩個枚舉數

int[] a = { 1, 2, 3 }; 

string[] str = { "one", "two", "three" }; 

版本1

var q = 
     a.Select((item, index) => 
     new { itemA = item, itemB = str[index] }).ToArray(); 

版本2

var query = from itemA in a 
      from index in Enumerable.Range(0,a.Length) 
      select new { A = itemA, B = str[index] }; 

回答

4

你的意思是?

var query = from index in Enumerable.Range(0,a.Length) 
      select new { A = a[index], B = str[index] }; 
+0

這應該工作,當然。 – 2009-12-13 19:29:17

4

這被稱爲zip在功能編程。它現在作爲內置的.NET 4.0提供,但您可以自己編寫它。他們的聲明是:

public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(
    this IEnumerable<TFirst> first, 
    IEnumerable<TSecond> second, 
    Func<TFirst, TSecond, TResult> func); 

您的結果將是這樣的:

var results = a.Zip(b, (x,y) => new { itemA = x, itemB = y }); 

儘管它在4.0的功能可以很容易地實現自己。

-1

你不應該。

版本1沒有錯;你不應該總是試圖使用查詢理解語法來獲得它的樂趣。

如果你真的想這樣做,你可以寫:

from i in Enumerable.Range(0, a.Length) 
select new { A = a[i], B = b[i] };