7

重複の可能性:
Linqを使用して3つのコレクションからアイテムを作成する

次のように2つのシーケンスのzipページを実行しました。

IEnumerable<Wazoo> zipped = arr1.Zip(arr2, (outer, inner) =>
  new Wazoo{P1 = outer, P2 = inner});

今、私は2つではなく3つのシーケンスを使用することに気づきました。そこで、コードを次のように再設計しようとしました。

IEnumerable<Wazoo> zipped = arr1.Zip(arr2, arr3, (e1, e2, e3) =>
  new Wazoo{P1 = e1, P2 = e2, P3 = e3});

もちろん、それは機能しませんでした。Zip私が目指しているものを組み込むために展開する方法はありますか?そのような使用法の他の方法はありますか?シーケンスの2つを圧縮してから、3番目のシーケンスを解凍して圧縮する必要がありますか?

この時点で、単純なforループとyield return要求された構造を作成しようとしています。するべきか?私は.Net4を使用しています。

4

1 に答える 1

11

既存の呼び出しを2つ使用するかZip(少し面倒ですが、機能します)、Zip3つのシーケンスを使用する独自の呼び出しを作成することもできます。

public static IEnumerable<TResult> Zip<TFirst, TSecond, TThird, TResult>
    (this IEnumerable<TFirst> source, IEnumerable<TSecond> second
    , IEnumerable<TThird> third
    , Func<TFirst, TSecond, TThird, TResult> selector)
{
    using(IEnumerator<TFirst> iterator1 = source.GetEnumerator())
    using(IEnumerator<TSecond> iterator2 = second.GetEnumerator())
    using (IEnumerator<TThird> iterator3 = third.GetEnumerator())
    {
        while (iterator1.MoveNext() && iterator2.MoveNext()
            && iterator3.MoveNext())
        {
            yield return selector(iterator1.Current, iterator2.Current,
                iterator3.Current);
        }
    }
}
于 2012-09-28T13:53:49.427 に答える