我有一个事件流,其中包含一些变量的值。值每秒都在变化。每个变量都有定义的上限、下限和阈值周期。
例如,假设变量 1 的上限 = 95,下限 = 5,阈值 = 5 秒。
因此,如果 Variable1 的值在阈值周期(5 秒)内保持在 95(上限)以上,那么我们应该创建一个输出事件。
我可以创建查询来检查各个事件(如果它们已超过限制),但我不确定如何创建窗口查询来检查阈值期间是否违反了限制。
谢谢,
我有一个事件流,其中包含一些变量的值。值每秒都在变化。每个变量都有定义的上限、下限和阈值周期。
例如,假设变量 1 的上限 = 95,下限 = 5,阈值 = 5 秒。
因此,如果 Variable1 的值在阈值周期(5 秒)内保持在 95(上限)以上,那么我们应该创建一个输出事件。
我可以创建查询来检查各个事件(如果它们已超过限制),但我不确定如何创建窗口查询来检查阈值期间是否违反了限制。
谢谢,
好吧,不完全是 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
部分,然后在那里屈服,然后简单地跳过窗口的其余部分。这取决于你想要做什么。