无功扩展:3连续出现记录

时间:2015-06-13 21:28:13

标签: c# system.reactive

我有一个热门观察 -

Class TableRecord

{
    string propertyA;
    DateTime dt;
    Dictionary<string,int> checkThreshHoldValues;
}  

如果连续3个值超过阈值,我需要检查字典中的每个值。如果是,我需要为该属性生成一个新事件。 (这里每次重新分配的时间为15分钟,即1小时内的4条记录。

Class GeneratedRecord
{
  string propertyA;
  DateTime lastTimeObserved;
  string dictionaryPropertyName;
  int lastValue
}

我知道我必须在缓冲区中使用groupByUntil,但不知怎的,我无法思考,如何将字典拆分成单独的部分仍然保持条件 任何帮助将不胜感激。

示例:假设我有PropertyA值在{&#34; TownA&#34;,&#34; TownB&#34;,&#34; TownC&#34;} 让我们说我在字典中的属性是{&#34;污染&#34;,&#34;温度&#34;,&#34;压力&#34;}

让我们说,我每15分钟收看一次,所以我的数据是 -

{"TownA" ,"6/14/2015 10:00",{ {"Pollution",61},{"Temperature",48},{"Pressure",40}}}

{"TownA" ,"6/14/2015 10:15",{ {"Pollution",63},{"Temperature",63},{"Pressure",40}}}

{"TownA" ,"6/14/2015 10:30",{ {"Pollution",49},{"Temperature",64},{"Pressure",40}}}
{"TownA" ,"6/14/2015 10:45",{ {"Pollution",70},{"Temperature",65},{"Pressure",40}}}

假设Threshhold值为60。 因此,在上面的示例中,只有Temperature满足条件,因为它具有{63,64,65}的值。对于污染,仅2个连续值高于60

问候

1 个答案:

答案 0 :(得分:0)

你应该可以使用重叠的窗口执行此操作,但是我无法计算出每次收到元素时启动新窗口的语法,并在包含三个项目时关闭窗口。但这是一个基于Observable.Create和维护队列的概念解决方案。在这种情况下,我使用Interval和一个简单的阈值(> 3):

Observable.Create<string>(observer =>
{
    var queue = new Queue<long>(3);



    return Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(value =>
    {
        if (queue.Count == 3)
        {
            queue.Dequeue();
        }

        queue.Enqueue(value);

        if (queue.Count == 3)
        {
            var values = queue.ToArray();
            if (values.All(v => v > 3))
            {
                observer.OnNext("All above 3. " + values[0] + " " + values[1] + " " + values[2]);
            }
        }
    });
})