在序列完成之前,有没有办法在缓冲区中使用聚合函数(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");
});
答案 0 :(得分:4)
使用Scan
代替Aggregate
。扫描的工作方式与聚合类似,只是它会在流前进时发出中间值。这对“跑步总数”有好处,这似乎是你要求的。
答案 1 :(得分:2)
Rx中的所有“统计”运算符(最小值/最大值/总和/计数/平均值)使用的机制在订阅完成时传播计算值,这是Scan
之间的巨大差异和Aggregate
,基本上如果您希望在订阅中推送新值时收到通知,则必须使用Scan
。
在您的情况下,如果您想保持相同的逻辑,您应该与GroupByUntil
或Window
运营商合并,使用它们的条件可以定期创建和完成组订阅,这将是用于推送下一个值。
您可以在此处获取更多信息: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