鉴于IObservable<T>
有一种方法可以使用Throttle
行为(在添加项目时重置计时器,但让它返回在该时间内添加的所有项目的集合?
Buffer
提供了类似的功能,它会在每个时间跨度或计数时将数据分块为IList<T>
。但每次添加项目时我都需要重置时间。
我在这里看到了类似的问题,Does reactive extensions support rolling buffers?,但答案看起来并不理想,而且有点旧,所以我想知道Rx-Main的发布版本现在是否支持这个功能。
答案 0 :(得分:9)
正如我answered in the other post,是的,你可以!使用Throttle
的{{1}}和Window
方法:
Observable
答案 1 :(得分:2)
我通过添加一个 Publish
组件修改了 Colonel Panic 的 BufferUntilInactive
操作符,以便它也能正确处理冷观察:
/// <summary>Projects each element of an observable sequence into consecutive
/// non-overlapping buffers, which are produced based on time and activity.</summary>
public static IObservable<IList<T>> BufferUntilInactive<T>(
this IObservable<T> source, TimeSpan dueTime)
{
return source.Publish(published =>
published
.Window(() => published.Throttle(dueTime))
.SelectMany(window => window.ToList())
);
}
答案 2 :(得分:0)