c# – Reactive Extensions SelectMany和Concat

据我所知,SelectMany的行为是将每个生成的值的结果有效地合并到一个流中,因此在非确定性中排序.

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

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

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

布莱尔

解决方法:

使用选择,而不是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会订阅所有内容,然后以正确的顺序重播这些值.

上一篇:javascript – 将非标准调度程序传递给运算符


下一篇:javascript – 如何在Rx.Observabale上链接订阅? (重构)