我有一个可观察到的流,它以不一致的时间间隔生成值,如下所示:
------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))
对于一般解决方案,请使用
0
将MostRecent
参数替换为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/