2016-11-23 52 views
-1

我想了解下面的例子,它結合了windowSelectMany。據我所知Window創建一個IObservable流(IObservable<IObservable<T>>)只要Observable開始發送項目。該流與SelectMany變平以獲得<IObservable<T>在Window和SelectMany中直觀的解釋

在這種video tutorial使用簡單IObservable,新的流創建SelectMany(讓說「線程」)時,其中一個功能是f applyied。

問題:

  1. 能不能請你,投一些光,數據在訂閱如何到達的,哪些是按照視頻教程的marble diagram
  2. 什麼是適用於扁平化流的功能?
  3. 最後,有可能提供一個更復雜的示例,其中SelectMany應用了一個簡單的函數,如Range以及結果如何在大理石圖中進行描述?

謝謝。

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'。但堆棧溢出帖子應該真的有一個特定的問題......目前這篇文章太寬泛,不清楚哪一部分你不明白。您是否瞭解「常規」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類型的,並且是一種把單個TSource對象到IObservable<TResult>對象的選擇器功能。它將選擇器功能應用於所有輸入,產生IObservable<IObservable<TResult>>,然後將其平滑(合併)爲一個對象。 Rx中的.SelectMany(selector)幾乎相當於.Select(selector).Merge()。因此,如果您撥打SelectMany(o => o)電話,與您的情況類似,這與撥打Merge的電話相同。

在我們的例子中,Window返回IObservable<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));