2 つのストリームに分離するときに (0, 1, 2, 3) を (0, 2) と (1, 3) にする場合、基本的にはバッファリングなしでは実行できません。必要なときだけバッファすることもできますが、それは難しいでしょう。基本的に、呼び出しを使用する 2 つの相反する方法に対処できる必要があります...
両方の反復子を取得し、それぞれから 1 つの項目を読み取ります。
// Ignoring disposing of iterators etc
var query = source.Demux(2);
var demuxIterator = query.GetEnumerator();
demuxIterator.MoveNext();
var first = demuxIterator.Current;
demuxIterator.MoveNext();
var second = demuxIterator.Current;
first.MoveNext();
Console.WriteLine(first.Current); // Prints 0
second.MoveNext();
Console.WriteLine(second.Current); // Prints 1
または、イテレータを 1 つ取得してから、両方の項目を読み取ります。
// Ignoring disposing of iterators etc
var query = source.Demux(2);
var demuxIterator = query.GetEnumerator();
demuxIterator.MoveNext();
var first = demuxIterator.Current;
first.MoveNext();
Console.WriteLine(first.Current); // Prints 0
first.MoveNext();
Console.WriteLine(first.Current); // Prints 2
2 番目のケースでは、1 を記憶するか、再読み取りできる必要があります。
IList<T>
代わりに対処できる可能性はありIEnumerable<T>
ますか?確かに、それはLINQ to Objectsの残りの部分を「壊す」でしょう-怠惰な投影などは過去のものになるでしょう。
これは、次のような操作の問題と非常によく似ていることに注意してくださいGroupBy
。それらは延期されますが、怠惰ではありません。GroupBy
結果から読み取りを開始するとすぐに、入力データ全体を読み取ります。