2

IEnumerable<A> a2とが与えられますIEnumerable<B> b。それらが同じ長さであることが保証されます。byを使用IEnumerable<C> cして各アイテムc_iが派生する新しいを作成したいと思います。Func<A, B, C> fc_i := f (a_i, b_i)

私が思いついた最善の方法は、両方のソースを手動で同時に列挙し、拡張メソッドとして実装された現在の結果を生成することです。.NET >= 4.0 でカスタム コードなしでそれを行う簡単な方法はありますか?

4

4 に答える 4

6

使用できますEnumerable.Zip

例えば

var c = a.Zip(b, (a, b) => SomeFunc(a, b));
于 2013-07-10T13:48:33.783 に答える
5

Zipメソッドを使用します。

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

指定された関数を 2 つのシーケンスの対​​応する要素に適用し、結果のシーケンスを生成します。

    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
于 2013-07-10T13:48:57.793 に答える
1

Enumerable.Zipを使用できます。関数 が与えられた場合f(A, B)、次のようになります。

var c = a.Zip(b, (aItem, bItem) => f(aItem, bItem)); 
于 2013-07-10T13:49:07.997 に答える
1

Zip 拡張メソッドの代替ソリューションは、ネストされた Select と SelectMany を使用して結果を平坦化することで実現できます。実装は、リスト内の同じインデックスを持つ要素のみを取る必要があります (外積ではありません)。

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 
于 2013-07-10T13:58:37.777 に答える