C# 为LINQ RX中的不同输入定义不同的路径

C# 为LINQ RX中的不同输入定义不同的路径,c#,.net,linq,system.reactive,reactive-programming,C#,.net,Linq,System.reactive,Reactive Programming,我正在学习LINQ RX,很难理解如何创建处理程序 假设我有一个IObservable源代码,它提供了一个实体流。现在,我想根据Entity.Group属性定义处理这些Entity对象的不同策略。我试过: source.Where(e=> e.Group = "first").Do(e=> whatever).Subscribe(); 它是有效的。问题是当我添加第二条路径时: source.Where(e=> e.Group == "first").Do(whateverWi

我正在学习LINQ RX,很难理解如何创建处理程序

假设我有一个
IObservable源代码
,它提供了一个实体流。现在,我想根据
Entity.Group
属性定义处理这些
Entity
对象的不同策略。我试过:

source.Where(e=> e.Group = "first").Do(e=> whatever).Subscribe();
它是有效的。问题是当我添加第二条路径时:

source.Where(e=> e.Group == "first").Do(whateverWithFirst).Subscribe();
source.Where(e=> e.Group == "second").Do(whateverWithSecond).Subscribe();
然后事情发生了两次,我发现一些异常与
source
是如何实现的有关

正确的方法是什么?

您可以使用以下方法在两个查询之间共享订阅:

var publishedSource = source.Publish().RefCount();
publishedSource.Where(e=> e.Group == "first").Do(whateverWithFirst).Subscribe();
publishedSource.Where(e=> e.Group == "second").Do(whateverWithSecond).Subscribe();

似乎您在热观测值和冷观测值之间的差异方面遇到了问题。在这个特定的示例中,您在第一次执行
whateverWithFirst
两次。很抱歉,这是一个输入错误。您需要让我们知道
IObservable
是如何创建的,特别是为了让我们知道它是热的还是冷的。您应该让我们知道异常是什么。啊,是的,我假设它是一个冷源。将其更改为
source.Publish().RefCount()
Publish返回一个IConnectableObservable,您必须调用
Connect
Disconnect
。RefCount方法添加了引用计数语义,以便在第一次订阅时调用Connect,在最后一次取消订阅时调用Disconnect。请参阅,没错,我忘记了RefCount()。这就是离开工作4周对你的影响:-)我只是想说清楚。。。当您使用
RefCount
时,可观测的源是热的还是冷的并不重要。唯一重要的是一个值是否在第一次订阅和第n次订阅之间产生。因此,
Observable.Timer(TimeSpan.FromSeconds(1)).StartWith(0)
将无法“正确”使用
RefCount
RefCount
使基础observable在收到其第一个订户时立即变热。