【发布时间】:2011-07-21 19:48:15
【问题描述】:
我需要一种方法来获取添加到符合特定条件的 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);但是,我现在从以前的question 知道,您必须在TakeLast() 将返回任何内容之前就该主题调用OnComplete()。调用 OnComplete() 对我来说不是一个选项,因为我需要保持这个流打开。
谁能验证这是否是我想要完成的最有效的方法?谢谢!
编辑
请注意,我正在使用响应式扩展,IEnumerable 代码示例将无法正常工作。
更新
我倾向于使用以下代码,因为我相信它是非阻塞的,除非有人能以不同的方式告诉我:
var latest = o.Where(i => i.StartsWith("b")).Replay(1);
using (latest.Connect())
latest.Subscribe(Console.WriteLine);
【问题讨论】:
-
@kevin:对不起,我可能遗漏了一些东西,但我看不出您发布的链接与我的情况有何关联。
-
基本上我发现了一些有“类似”问题的帖子(得到“最后一个”项目)。那个表明你必须返回 2 个项目......另一个可能有帮助的项目在这里:social.msdn.microsoft.com/Forums/en-SG/rx/thread/… 但我已经超出了我的头脑,所以我现在就停下来。 3次罢工! :)
-
请记住,使用 UPDATE 解决方案,在您调用 Connect 之前发生的任何订阅都将返回“blueberry”作为第一个值,“banana”作为第二个值。
标签: c# .net system.reactive