2014-10-10 58 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将订阅所有内容,然后以正确的顺序重播这些值。