反应性扩展:事件的频率

时间:2014-05-27 20:54:56

标签: c# system.reactive

让我说我有一个类似的课程 MyClass {string id,string eventType,datetime ts}

ts是事件的时间戳,Id是我想要计算的频率

我有一个热门观察MyClass,我想计算最近30秒内每个stringId的事件数量

如果事件数超过5,我引发另一个MyClass事件(具有相同的Id,eventType =“New”),如果它再次低于3,我需要更新先前引发的事件(使用相同的事件) Id,和eventType =“New”)。

我想我需要使用滑动窗口,到目前为止已经达到了

public static IObservable<MyClass> CountFrequency(this IObservable<MyClass> source, TimeSpan withinPeriod, string marker)
{
    // var scheduler = new HistoricalScheduler();
    //  var driveSchedule = source.Subscribe(e => scheduler.AdvanceTo(e.Timestamp)); 
    return source.Window(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(5))
        .SelectMany(sl => sl)
        .GroupBy(a => a.id)
        .SelectMany(go => go
        .Aggregate(new MyClass(), (acc, evt) => CustomAggFrequency(acc, evt, marker))
        .Select(count => count)));
}

我无法理解

a)如何将调度程序与数据的时间戳相关联,而不是系统时间 b)如何编写CustomAggFrequency的逻辑

任何建议

1 个答案:

答案 0 :(得分:0)

这不起作用吗?你的问题是这样的,很难弄清楚你想要什么。

var span = TimeSpan.FromSeconds(30);
var shift = TimeSpan.FromSeconds(5);
var query = source
    .Window(span, shift)
    .Select(window => window
        .GroupBy(item => item.id)
        .ToDictionary(g => x.Key, g => g.Count() / span.TotalSeconds));

query将每隔5秒发出一个字典,在最后30秒内将每个id映射到赫兹的频率。它的类型是IObservable<Dictionary<string, double>>