3

多重化と逆多重化に LINQ to Objects を使用して遊んでいますが、これはかなり難しい問題のようです。

次のデマルチプレクサ シグネチャを参照してください。

public static IEnumerable<IEnumerable<TSource>> Demux<TSource>(this IEnumerable<TSource> source, int multiplexity)

抽象的なレベルではこれは簡単ですが、理想的には

  • ソース ストリームを怠る
  • 多重化されたストリームごとに怠惰なまま
  • 同じ要素を繰り返さない

これをどのように行いますか?

少し疲れているので、ここで集中力が切れているのかもしれません...

4

1 に答える 1

2

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結果から読み取りを開始するとすぐに、入力データ全体を読み取ります。

于 2010-03-06T14:34:55.407 に答える