0

我有一个事件流,其中包含一些变量的值。值每秒都在变化。每个变量都有定义的上限、下限和阈值周期。

例如,假设变量 1 的上限 = 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 回答