如何在完成之前从ReplaySubject 获取最新值
我需要一种方法来获取添加到符合特定条件的ReplaySubject的最新项目。 下面的示例代码完成了我需要它做的事情,但它感觉不像正确的方法:
static void Main(string[] args) { var o = new ReplaySubject(); 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)
; 但是,我现在从上一个问题知道你必须在TakeLast()
之前TakeLast()
才能返回任何内容。 调用OnComplete()
对我来说不是一个选项,因为我需要保持此流打开。
任何人都可以validation这是否是我想要完成的最有效的方法吗? 谢谢!
编辑
请注意,我正在使用Reactive Extensions,IEnumerable代码示例将无法正常工作。
UPDATE
我倾向于以下代码,因为我认为它是非阻塞的,除非任何人都能以不同的方式告诉我:
var latest = o.Where(i => i.StartsWith("b")).Replay(1); using (latest.Connect()) latest.Subscribe(Console.WriteLine);
您可以考虑使用BehaviorSubject
。 缺点是你必须在开始时订阅,但这可能是你想要做的。 这应该为您提供所需的隔离。
var o = new ReplaySubject(); var bs = new BehaviorSubject (default(string)); o.Where(i => i.StartsWith("b")).Subscribe(bs); o.OnNext("blueberry"); Console.WriteLine(bs.First()); o.OnNext("chimpanzee"); Console.WriteLine(bs.First()); o.OnNext("abacus"); Console.WriteLine(bs.First()); o.OnNext("banana"); Console.WriteLine(bs.First()); o.OnNext("apple"); Console.WriteLine(bs.First()); o.OnNext("cheese"); Console.WriteLine(bs.First());
输出:
blueberry blueberry blueberry banana banana banana
只要您对使用这些阻塞运算符(它看起来像你)感到满意,我就会考虑使用MostRecent运算符。
上述就是C#学习教程:如何在完成之前从ReplaySubject 获取最新值分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
static void Main(string[] args) { var o = new ReplaySubject(); 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")) .MostRecent("SomeDefaultValue") .First(); Console.WriteLine(latest); Console.WriteLine("Press any key to exit"); Console.ReadKey(); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/952217.html