Ну, не совсем 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
}
Примечание. Если ваши события представляют собой потенциально бесконечный поток и окна событий могут стать очень большими, вы не получите окно, возвращаемое до тех пор, пока оно не будет полностью использовано, что может занять некоторое время и память. Вы можете разбить часть TakeWhile
, увидев 5 элементов, а затем сдаться и просто пропустить оставшуюся часть окна. Это зависит от того, что именно вы хотите сделать.