5

IEnumerable<T>多くの要素を持つ2つ(またはそれ以上)があると仮定します。すべてIEnumerableに別のタイプがありTます。リストは非常に長くなる可能性があるため、メモリに完全にロードしないでください。

IEnumerable<int> ints = getManyInts();
IEnumerable<string> strings = getSomeStrings();
IEnumerable<DateTime> dates = getSomeDates();

私がやりたいのは、これらのリストを繰り返し処理し、最長または最短のリストの最後に到達するまで、ステップごとに1つのint、1つの文字列、および1つのDateTimeを含むアイテムを取得することです。両方のケースをサポートする必要があります(bool param longest vs. shortestなど)。短いリストで利用できないすべてのアイテムについて(すでに終わりに達しているため)、デフォルト値を期待します。

for(Tuple<int,string,DateTime> item in 
    Foo.Combine<int,string,DateTime>(ints, strings, dates))
{
    int i=item.Item1;
    string s=item.Item2;
    DateTime d=item.Item3;
}

遅延実行を使用してlinqでこれを行うことは可能ですか?IEnumeratorsをyieldreturnと直接組み合わせて使用​​するソリューションを知っています。.NET2で2つのIEnumerableを同時に反復処理する方法を参照してください。

4

1 に答える 1

4

このような何かがそれを行う必要があります(警告-テストされていません):

public static IEnumerable<Tuple<T, U, V>> IterateAll<T, U, V>(IEnumerable<T> seq1, IEnumerable<U> seq2, IEnumerable<V> seq3)
{
    bool ContinueFlag = true;
    using (var e1 = seq1.GetEnumerator())
    using (var e2 = seq2.GetEnumerator())
    using (var e3 = seq3.GetEnumerator())
    {
        do
        {
            bool c1 = e1.MoveNext();
            bool c2 = e2.MoveNext();
            bool c3 = e3.MoveNext();
            ContinueFlag = c1 || c2 || c3;

            if (ContinueFlag)
                yield return new Tuple<T, U, V>(c1 ? e1.Current : default(T), c2 ? e2.Current : default(U), c3 ? e3.Current : default(V));
        } while (ContinueFlag);
    }
}
于 2011-02-03T16:34:34.827 に答える