Re: Оконная функция, или что-то похожее...
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.10.18 07:58
Оценка: 13 (3) +1
Здравствуйте, Tasheehoo, Вы писали:

T>Привет.


T>Есть поток значений.

T>Значения скачцт вверх и вниз(больше/меньше).
T>Нужно сделать так чтоб если значение попадает в указанный диапазон, определять это событие. И нужно какимто образом сделать это окно(диапазон), вроде прилипающим чтоле... Чтоб избежать лишних срабатываний если следующее придшее значение будет незначительно ниже или выше этого "окна"..

T>Подскажите как это сделать, или что гуглить.


T>UP.


T>Может сделать это по тригерной логике? Когда значение достигает порога вхождения в "окно" — тригер срабатывает, а чтоб тригер сработал в обратну сторону значение должно достичь противополодной граници окна?

T>Как такое называется?
High watermark, low watermark. Так работают водокачки: включаются, когда значение ниже минимума, и выключаются, когда выше максимума.

public IEnumerable<int> HighLowWatermarkFilter(IEnumerable<int> source, int lowWaterMark, int highWaterMark)
{
   if (source == null)
     throw new ArgumentNullException(nameof(source));
   if(highWaterMark<lowWaterMark)
     throw new ArgumentException();
   return HighLowWatermarkFilterImpl(source, lowWaterMark, highWaterMark);
}

private IEnumerable<int> HighLowWatermarkFilterImpl(IEnumerable<int> source, int lowWaterMark, int highWaterMark)
{
   bool high = true;
   foreach(var val in source)
   {
     if(high && val < lowWaterMark)
     {
        high = false; yield return val;
     }
     if(!high && val > highWaterMark)
     {
        high = true; yield return val;
     }
   }
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.