Reactive Extensions SelectMany和Concat

时间:2014-10-10 13:00:04

标签: c# system.reactive reactive-programming rxjs

据我所知,SelectMany的行为是将每个生成的值的结果有效地合并到一个单独的流中,以便在非确定性中进行排序。

如何在C#中的RxJs中执行类似于concatAll的操作。

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

这实际上是我想做的事情,给定一个范围,然后按照它们开始的顺序等待每一个连续。显然这是一个玩具示例,但想法就在那里。

布莱尔

1 个答案:

答案 0 :(得分:5)

使用Select,而不是SelectMany。您要使用的Concat重载适用于IObservable<IObservable<T>>,因此只需投影内部序列,不要展平它们。

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

请注意,使用Interval会延迟每个Concat的子作品;即,当您订阅时,第一个Interval会立即开始,但所有剩余的时间间隔都会生成并在没有订阅的情况下排队。它不像Concat订阅所有内容,然后在以后以正确的顺序重放值。