如何将两个枚举与自定义函数结合起来?

时间:2013-07-10 13:46:01

标签: c# .net linq enumeration

给出两个IEnumerable<A> aIEnumerable<B> b。保证它们具有相同的长度。我想创建一个新的IEnumerable<C> c,其中每个项c_i都是使用Func<A, B, C> f c_i := f (a_i, b_i)推导出的。{/ p>

我能想到的最好的是两个源上的手动同时枚举,并产生当前结果,作为扩展方法实现。如果没有.NET&gt; = 4.0?

中的自定义代码,有没有简短的方法

4 个答案:

答案 0 :(得分:6)

您可以使用Enumerable.Zip

e.g。

var c = a.Zip(b, (a, b) => SomeFunc(a, b));

答案 1 :(得分:5)

使用Zip方法。

http://msdn.microsoft.com/en-us/library/dd267698.aspx

  

将指定的函数应用于两个对应的元素   序列,产生一系列结果。

    int[] numbers = { 1, 2, 3, 4 };
    string[] words = { "one", "two", "three" };

    var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);

    foreach (var item in numbersAndWords)
        Console.WriteLine(item);

    // This code produces the following output: 

    // 1 one 
    // 2 two 
    // 3 three

答案 2 :(得分:1)

您可以使用Enumerable.Zip。给定函数f(A, B),您将拥有

var c = a.Zip(b, (aItem, bItem) => f(aItem, bItem)); 

答案 3 :(得分:1)

使用嵌套的Select和SelectMany可以实现Zip扩展方法的替代解决方案以展平结果。实现应该只采用列表中具有相同索引的元素(而不是交叉产品):

private int fun(int a, int b)
{
    return a * b;
}

var l1 = new List<int> { 1, 2, 3 };
var l2 = new List<int> { 4, 5, 6 };

var r = l1.Select((e1, i1) => l2.Select ((e2, i2) => i1 == i2 ? fun(e1, e2) : 0))
        .SelectMany (flat => flat)
        .Where(re => re != 0)
        .ToList();

这种情况下的输出是:

4 
10 
18