Мне нужен способ получения самого последнего элемента, добавленного в объект воспроизведения, который соответствует определенным критериям.Пример кода ниже делает то, что мне нужно, но это не похоже на правильный подход:
static void Main(string[] args)
{
var o = new ReplaySubject<string>();
o.OnNext("blueberry");
o.OnNext("chimpanzee");
o.OnNext("abacus");
o.OnNext("banana");
o.OnNext("apple");
o.OnNext("cheese");
var latest = o.Where(i => i.StartsWith("b"))
.Latest().First();
Console.WriteLine(latest);
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
Вывод:
banana
Press any key to exit
Изначально я попытался использовать .Where().TakeLast(1)
;однако теперь я знаю из предыдущего вопроса , что вы должны позвонить OnComplete()
по этому вопросу, прежде чем TakeLast()
вернет что-либо.Вызов OnComplete()
для меня не вариант, потому что мне нужно держать этот поток открытым.
Может ли кто-нибудь подтвердить, является ли это наиболее эффективным подходом к тому, чего я пытаюсь достичь?Спасибо!
РЕДАКТИРОВАТЬ
Обратите внимание, что я использую Reactive Extensions и IEnumerable примеры кода не будут работать.
ОБНОВЛЕНИЕ
Я склоняюсь к следующему коду, потому что считаю, что он неблокирующий, если кто-то не скажет мне по-другому:
var latest = o.Where(i => i.StartsWith("b")).Replay(1);
using (latest.Connect())
latest.Subscribe(Console.WriteLine);