2014-10-10 64 views
3

我明白SelectMany的行爲是將每個生成的值的結果有效地合併到一個流中,以便確定非確定性排序。反應性擴展SelectMany和Concat

如何在C#中的RxJs中執行類似於concatAll的操作。

var obs = Observable.Range (1, 10).SelectMany (x => { 
return Observable.Interval (TimeSpan.FromSeconds(10 - x)).Take (3); 
}).Concat(); 

這是什麼有效的我想要做的,給定一個範圍,等一等每個然後在命令CONCAT,他們開始。顯然,這是一個玩具的例子,但這個想法是存在的。

布萊爾

回答

3

使用Select,不SelectMany。您想要使用的Concat過載適用於IObservable<IObservable<T>>,因此只需簡單地設計內部序列,不要將它們弄平。

var obs = Observable.Range(1, 10) 
        .Select(x => Observable.Interval(TimeSpan.FromSeconds(10 - x)).Take(3)) 
        .Concat(); 

注意,每個Interval的subscrition通過使用Concat推遲;即第一個Interval在您訂閱時立即啓動,但是所有剩餘時間間隔都會生成並且無需訂閱即可排隊。這不像Concat將訂閱所有內容,然後以正確的順序重播這些值。