まあ、完全に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
そこで降伏し、その後ウィンドウの残りを単純にスキップすることができます。それはあなたが正確に何をしたいかによって少し異なります。