我有一个可观察到的流,它以不一致的时间间隔生成值,如下所示:

------1---2------3----------------4--------------5---

我想对此进行采样,但是一旦产生a值,就不会有任何空样本:
------1---2------3----------------4--------------5-----

----_----1----2----3----3----3----4----4----4----5----5

我显然认为Replay().RefCount()可在此处用于提供Sample()的最后一个已知值,但由于它没有重新订阅源流,因此无法正常工作。

关于如何执行此操作有任何想法吗?

最佳答案

假设您的源流是IObservable<int> xs,然后您的采样间隔是Timespan duration,则:

xs.Publish(ps =>
    Observable.Interval(duration)
        .Zip(ps.MostRecent(0), (x,y) => y)
        .SkipUntil(ps))

对于一般解决方案,请使用0MostRecent参数替换为default(T),其中IObservable<T>是源流类型。
Publish的目的是防止订阅副作用,因为我们需要两次订阅源-一次订阅MostRecent,一次订阅SkipUntil。后者的目的是防止在源流的第一个事件之前对值进行采样。

如果您不希望在源流的第一个事件之前获取默认值,则可以简化此操作:
Observable.Interval(duration)
    .Zip(xs.MostRecent(0), (x,y) => y)

相关的运算符WithLatestFrom可能也很有趣;它将在下一个版本中发布到Rx。有关详细信息,请参见here

关于c# - react 性扩展(Rx)-当间隔中不存在任何值时,使用最近的已知值进行采样,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30167690/

10-17 01:58