IObservable序列完成之前的聚合函数

时间:2015-01-09 15:03:37

标签: c# system.reactive

在序列完成之前,有没有办法在缓冲区中使用聚合函数(Max,Count,....)。 完成后,这将产生结果,但是继续流不会给出 有什么结果吗?

我期待有一些方法可以使用缓冲区吗?

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");
});

2 个答案:

答案 0 :(得分:4)

使用Scan代替Aggregate。扫描的工作方式与聚合类似,只是它会在流前进时发出中间值。这对“跑步总数”有好处,这似乎是你要求的。

答案 1 :(得分:2)

Rx中的所有“统计”运算符(最小值/最大值/总和/计数/平均值)使用的机制在订阅完成时传播计算值,这是Scan之间的巨大差异和Aggregate,基本上如果您希望在订阅中推送新值时收到通知,则必须使用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