问题是:有一个数值流。值是以脉冲方式推入的,因此100个值可以非常接近彼此(按时间顺序),即每5-10毫秒,然后它可能会停止一段时间,然后突发again.The的概念是显示最长为500 ms的窗口的累积值(和)。
我的第一次尝试是使用缓冲区( 500 ms),但是这会导致事件的持续抽吸(每500毫秒),其之和为0(作为累积的缓冲区项os 0),可以用空缓冲区过滤来修复它,但我真的想完全避免这种情况,只有在一个值在“沉默”一段时间后才打开缓冲区。
附加限制:实现是UniRx,它不包含所有Rx操作符,特别是窗口(在这种情况下可能有用),因此解决方案仅限于基本操作符,包括缓冲区。
发布于 2020-03-19 20:32:18
因为您只想要求和,所以使用Buffer就太过分了。我们可以运行Scan或Aggregation。
var burstSum =
source
.Scan(0, (acc, current) => acc + current)
.Throttle(TimeSpan.FromMilliseconds(500))
.Take(1)
.Repeat();这将启动一个流,该流累加该总和,直到该流已空闲至少500 at。
但如果我们想至少每次发射桶,我们将不得不走一条不同的道路。我们做了两个假设:
元素之间的时间间隔之和应该等于第一个和最后一个element.
Throttle之间的时间间隔,在流完成时将释放最后一个值。源.TimeInterval() .Scan((acc,cur) => new (acc.Value+ cur.Value,acc.Interval + cur.Interval)) .TakeWhile(acc => acc.Interval <= TimeSpan.FromMilliseconds(500) .Throttle(TimeSpan.FromMilliseconds(500)) .Throttle( TimeSpan.FromMilliseconds(500)) .Select(acc => acc.Value) (1)();en21#
https://stackoverflow.com/questions/60727104
复制相似问题