问题:有大量数字值。值以突发方式推送,因此100个值可以彼此非常接近(按时间顺序),例如每5-10毫秒,然后可能停止一会儿,然后又可以突发。其想法是显示累积值(总和)最多500毫秒的窗口数。
[我的第一次尝试是使用Buffer(500ms),但是这会导致事件(每500毫秒)不断地被泵送(总和为os 0,总和为0),可以通过空缓冲区进行过滤来解决,但是我确实希望完全避免这种情况,只在经过一段时间的“静默”后实际推入一个值后才打开缓冲。
附加限制:实现是UniRx,它不包含所有Rx运算符,尤其是Window(我怀疑在这种情况下可能有用),因此解决方案仅限于包括Buffer在内的基本运算符。
因为您只想要总和,所以使用Buffer
是过大的。我们可以运行Scan
或Aggregation
。
var burstSum =
source
.Scan(0, (acc, current) => acc + current)
.Throttle(TimeSpan.FromMilliseconds(500))
.Take(1)
.Repeat();
这将开始累积总和的流,直到该流空闲至少500ms。
但是如果我们想至少每个时间段都发射一次,我们必须走不同的道路。我们做出两个假设:
[Throttle
将在流完成时释放最后一个值。
source
.TimeInterval()
.Scan((acc, cur) => new TimeInterval<int>(acc.Value + cur.Value, acc.Interval + cur.Interval))
.TakeWhile(acc => acc.Interval <= TimeSpan.FromMilliseconds(500))
.Throttle(TimeSpan.FromMilliseconds(500))
.Select(acc => acc.Value)
.Take(1)
.Repeat();