Мне нужен способ получить самый последний элемент, добавленный в ReplaySubject, который соответствует определенным критериям. Пример кода ниже делает то, что мне нужно, но он не кажется правильным подходом:
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() для меня не вариант, потому что мне нужно держать этот поток открытым.
Может ли кто-нибудь подтвердить, является ли это наиболее эффективным подходом к тому, чего я пытаюсь достичь? Спасибо!
ИЗМЕНИТЬ
Обратите внимание, что я использую реактивные расширения, и образцы кода IEnumerable не будут работать.
ОБНОВЛЕНИЕ
Я склоняюсь к следующему коду, потому что считаю, что он не блокирует, если только кто-нибудь не скажет мне по-другому:
var latest = o.Where(i => i.StartsWith("b")).Replay(1);
using (latest.Connect())
latest.Subscribe(Console.WriteLine);