Linq - 如何结合两个enumerables

时间:2009-12-13 19:18:23

标签: c# linq

如何修改版本2以产生与版本1相同的结果,因为在版本2中我是 获得克里特产品。

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

3 个答案:

答案 0 :(得分: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 :(得分:4)

你是说这个吗?

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

答案 2 :(得分:-1)

你不应该。

版本1没有任何问题;你不应该总是尝试使用查询理解语法,只是为了它的乐趣。

如果您真的想这样做,可以写下以下内容:

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