我有一个热门观察 -
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
问候
答案 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]);
}
}
});
})