首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >突发性数据的反应性积累

突发性数据的反应性积累
EN

Stack Overflow用户
提问于 2020-03-17 17:11:43
回答 1查看 299关注 0票数 0

问题是:有一个数值流。值是以脉冲方式推入的,因此100个值可以非常接近彼此(按时间顺序),即每5-10毫秒,然后它可能会停止一段时间,然后突发again.The的概念是显示最长为500 ms的窗口的累积值(和)。

我的第一次尝试是使用缓冲区( 500 ms),但是这会导致事件的持续抽吸(每500毫秒),其之和为0(作为累积的缓冲区项os 0),可以用空缓冲区过滤来修复它,但我真的想完全避免这种情况,只有在一个值在“沉默”一段时间后才打开缓冲区。

附加限制:实现是UniRx,它不包含所有Rx操作符,特别是窗口(在这种情况下可能有用),因此解决方案仅限于基本操作符,包括缓冲区。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-19 20:32:18

因为您只想要求和,所以使用Buffer就太过分了。我们可以运行ScanAggregation

代码语言:javascript
复制
  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#

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60727104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档