つまり、Linqの結合、グループ化、個別化などと同様に、コレクションではなく、値のシーケンスのみを処理することを意味します。
シーケンスとコレクションの違いは、シーケンスの長さが無限であるのに対し、コレクションは有限である可能性があることです。
例を挙げましょう:
var c1 = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var c2 = FunctionThatYieldsFibonacciNumbers();
var c3 = c1.Except(c2);
これは動作しません。Exceptの実装は、いずれかのコレクションの数値が厳密に昇順または降順であることに基づいて機能しないため、最初に2番目のコレクションからすべての値をセット(または同様のもの)に収集しようとし、その後でのみ実行されます。最初のコレクションの列挙を開始します。
上記の関数が、明示的に列挙を停止しない限り終了しないWhileループであると仮定すると、上記のコードはメモリ不足の例外で失敗します。
しかし、厳密に昇順または降順であると見なされるコレクションがあることを考えると、.NET4.0にすでに実行できる実装はありますか。
- 両方に共通するすべての値を教えてください(内部結合)
- 両方のすべての値を教えてください(ユニオン/外部結合)
- シーケンス#2にないシーケンス#1のすべての値を教えてください
構築する必要のあるスケジューリングシステムに関連するこのタイプの機能が必要です。ここでは、次のようなことを行う必要があります。
c1=2010年1月以降の毎月1日と15日 c2=2010年以降の平日 c3 = 2010〜2012年のすべての日 c4=c1およびc2およびc3
これは基本的に、2010年から2012年まで毎月1日と15日ごとに与えられますが、それらの日付が平日に当たる場合に限ります。
このような関数を使用すると、コレクションを明示的に作成しなくても、問題の値を生成するのがはるかに簡単になります。上記の例では、最初の2つのコレクションを作成するには、3番目のコレクションの制約を知る必要があり、例は上記よりもはるかに複雑になる可能性があります。