0

いくつかの変数の値を含むイベントストリームがあります。値は毎秒変化します。各変数には、上限、下限、およびしきい値期間が定義されています。

たとえば、Variable1の上限= 95、下限= 5、しきい値=5秒であるとします。

したがって、Variable1の値がしきい値期間(5秒)の間95(上限)を超えたままである場合は、出力イベントを作成する必要があります。

個々のイベントをチェックするためのクエリを作成することはできますが(制限を超えている場合)、しきい値期間中に制限に違反していないかどうかを確認するためのウィンドウクエリを作成する方法がわかりません。

ありがとう、

4

1 に答える 1

1

まあ、完全にLinqクエリではありませんが、トリックを行う必要があります:

public IEnumerable<IEnumerable<int>> GetWindows(IEnumerable<int> events)
{
    while (events.Any())
    {
        events = events.SkipWhile(x => x > 5 && x < 95);
        if (events.Any())
        {
            var isLow = events.First() <= 5;
            var res = events.TakeWhile(x => isLow ? x <= 5 : x >= 95).ToList();
            if (res.Count >= 5)
                yield return res;
            events = events.Skip(res.Count);
        }
    }
}

基本的:

  • 興味のないイベントをすべてスキップする
  • ウィンドウを取り、しきい値期間よりも多くのエントリがある場合はそれを譲ります
  • ウィンドウをスキップして列挙を進める

次のように使用できます。

foreach (var window in GetWindows(events))
{
   ... raise event
}

注: イベントが潜在的に無限のストリームとして受信され、イベント ウィンドウが非常に大きくなる可能性がある場合、ウィンドウが完全に消費されるまでウィンドウが返されず、時間とメモリがかかる可能性があります。5 つの要素を見た後でパーツを壊して、TakeWhileそこで降伏し、その後ウィンドウの残りを単純にスキップすることができます。それはあなたが正確に何をしたいかによって少し異なります。

于 2011-12-12T18:50:20.630 に答える