2013-09-13 2 views
2

Есть ли какой-нибудь метод расширения в Rx, чтобы сделать сценарий ниже?Между значениями с Rx

Between values

У меня есть значение, чтобы начать накачка (зеленые кружки) и другое значение, чтобы остановить накачки (тростниковые круги), синие круги должны быть ожидаемые значения, я не хотел бы эту команду, чтобы быть отменены и воссозданы (т.е. «TakeUntil» и «SkipUntil» не будут работать).

Реализация с помощью LINQ будет что-то вроде этого:

public static IEnumerable<T> TakeBetween<T>(this IEnumerable<T> source, Func<T, bool> entry, Func<T, bool> exit) 
    { 
     bool yield = false; 
     foreach (var item in source) 
     { 
      if (!yield) 
      { 
       if (!entry(item)) 
        continue; 

       yield = true; 
       continue; 
      } 

      if (exit(item)) 
      { 
       yield = false; 
       continue; 
      } 

      yield return item; 
     } 
    } 

Как это та же логика для IObservable<T>?

ответ

2

Вот что вам нужно, как метод расширения:

public static IObservable<T> TakeBetween<T>(
    this IObservable<T> source, 
    Func<T, bool> entry, 
    Func<T, bool> exit) 
{ 
    return source 
     .Publish(xs => 
     { 
      var entries = xs.Where(entry); 
      var exits = xs.Where(exit); 
      return xs.Window(entries, x => exits); 
     }) 
     .Switch(); 
} 

Главное я включил в это Использованный расширения Publish , В этом конкретном случае это важно, так как ваш наблюдаемый источник может быть «горячим», и это позволяет делиться исходными значениями без создания нескольких подписей на источник.

+0

Спасибо за ответ, но мне нравится чистая реализация (возможно, в классе) без создания нескольких наблюдаемых. (Я считаю, что некоторая производительность потеряна), я видел, что вы отредактировали, теперь отлично работает. –

+0

@ J.Lennon - Что вы подразумеваете под «чистой реализацией» и «возможно, в классе»? А где же множественные наблюдаемые? – Enigmativity

3

Я думаю, что вы можете использовать Window:

source.Window(entrySignal, _ => exitSignal).Switch(); 
+0

Это не сработало, или я не знаю, как его использовать .. Существует проблема, если вы получаете более одного входного сигнала. –

+0

Я не знаю о производительности, но если я добавлю метод .Switch(), он работает, спасибо –

+0

А я не знал, что у вас может быть несколько сигналов ввода перед сигналом выхода. – Brandon

Смежные вопросы