我理解 SelectMany 的行为是有效地将产生的每个值的结果合并到一个流中,因此排序是不确定的。
我如何在 C# 中的 RxJs 中执行类似于 concatAll 的操作。
var obs = Observable.Range (1, 10).SelectMany (x => {
return Observable.Interval (TimeSpan.FromSeconds(10 - x)).Take (3);
}).Concat();
这实际上是我想要做的,给定一个范围,等待每个范围,然后按照它们开始的顺序进行连接。显然这是一个玩具示例,但想法就在那里。
布莱尔
最佳答案
使用 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
将订阅所有内容,然后稍后以正确的顺序重播这些值。
关于c# - 响应式扩展 SelectMany 和 Concat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26300072/