IO可保护序列完成前的聚合函数

本文关键字:函数 保护 IO | 更新日期: 2023-09-27 18:36:51

有没有办法在序列完成之前将聚合函数(最大值、计数等)与缓冲区一起使用。完成后,这将产生结果,但对于继续流,它不会给出有什么结果吗?

我期待有某种方法可以使用缓冲区进行这项工作?

IObservable<long> source;
IObservable<IGroupedObservable<long, long>> group  = source
        .Buffer(TimeSpan.FromSeconds(5))
        .GroupBy(i => i % 3);
IObservable<long> sub = group.SelectMany(grp => grp.Max());
sub.Subscribe(l =>
{
    Console.WriteLine("working");
});

IO可保护序列完成前的聚合函数

使用 Scan 而不是 Aggregate 。 扫描的工作方式与聚合类似,只是它会在流前进时发出中间值。 它适用于"运行总计",这似乎是您所要求的。

Rx(最小/最大/总和/计数/平均值)中的所有"统计"运算符都在使用一种机制,该机制在订阅完成时传播计算值,这就是ScanAggregate之间的巨大区别,基本上如果您想在订阅中推送新值时收到通知,则必须使用Scan

在你的情况下,如果你想保持相同的逻辑,你应该与GroupByUntilWindow运算符结合使用,使用两者的条件可以定期创建和完成组订阅,这将用于推送下一个值。

您可以在此处获取更多信息:http://www.introtorx.com/content/v1.0.10621.0/07_Aggregation.html#BuildYourOwn

顺便说一下,我写了一篇与你想要的东西相关的文本。入住: http://www.codeproject.com/Tips/853256/Real-time-statistics-with-Rx-Statistical-Demo-App