2016-11-23 3 views
-1

windowSelectManyを組み合わせた次の例を理解しようとしています。私が知る限り、Observableがアイテムを送信し始めるとすぐに、WindowIObservableストリーム(IObservable<IObservable<T>>)を作成します。このストリームはSelectManyで平滑化され、<IObservable<T>になります。機能fがapplyiedされる。このvideo tutorialWindowとSelectManyの直感的な説明

(「スレッド」と言ってみましょう)、新しいストリームが作成され、簡単なIObservableSelectManyを使用して、。

質問:

  1. あなたは、データをサブスクライブに到着し、何marble diagramは、ビデオチュートリアルに従っているかについて、いくつかの光を投げかけていただけますか?
  2. ストリームをフラット化するために適用される関数は何ですか?
  3. 最後に、SelectManyRangeのような単純な関数を適用し、どのように結果が大理石図で表されているかという、より複雑な例を提供することは可能ですか?

ありがとうございます。

var source = Observable.Interval(TimeSpan.FromMilliseconds(100))// start a counter from zero and last 100 milliseconds 
     .Take(5) // take only the first 5 items 
     .Window(2) 
     .SelectMany(c => c); 

source.Subscribe(
    value => Console.WriteLine(value.ToString()), 
    error => Console.WriteLine(error.Message), 
    () => Console.WriteLine("Completed") 
); 

Console.WriteLine("Press any key to exit"); 
Console.ReadKey(); 
+2

」ストリーム?" - ええ、SelectMany。しかし、スタックオーバーフローポストは実際には* 1つの*特定の質問を持っている必要があります...この投稿はあまりにも広範かつ明確ではない正確には分かりません。 「通常の」LINQで 'SelectMany'を理解していますか?あなたはその知識をここに適用できるはずです。もしそうでなければ、私はあなたがどこから始めるべきかを提案します。 –

答えて

1

次のように上記のコードの各ステップのための大理石の図である。

interval: 0----1----2----3----4----5----6----7---- 
take5 : 0----1----2----3----4| 
window : W1--------W2--------W3| 
window1: 0----1| 
window2:   2----3| 
window3:      4| 
slctmny : 0----1----2----3----4| 
SelectMany

TSourceの観察を受け取り、IObservable<TResult>オブジェクトに単一TSourceオブジェクトを変換セレクタ機能。セレクタ関数をすべての入力に適用してIObservable<IObservable<TResult>>を生成し、次に1つのIObservable<TResult>オブジェクトにフラット(マージ)します。 Rxの.SelectMany(selector)は、ほぼ.Select(selector).Merge()に相当します。したがって、SelectMany(o => o)通話をご利用の場合は、Merge通話と同じです。我々の場合には

WindowIObservable<IObservable<long>>を返しているので、TSourceIObservable<long>を入力しています。セレクタ関数はIObservable<long>を返します。したがって、TResultlongです。

Rangeを使用した例です。セレクタは{0}、{0,1}、{0,1,2}、{0,1,2,3}などのような観測値を返しますが、SelectManyあなたが観察できるものを得るので、それを平らに:正確に平坦にするために適用された機能は何ですか{0、0、1、0、1、2、0、1、2、3 ...}

var source = Observable.Interval(TimeSpan.FromMilliseconds(100))// start a counter from zero and last 100 milliseconds 
     .Take(5) // take only the first 5 items 
     .SelectMany(l => Observable.Range(0, (int)l)); 
関連する問題