Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有反应式扩展的动态级联序列_C#_.net_System.reactive_Observable_Rx.net - Fatal编程技术网

C# 具有反应式扩展的动态级联序列

C# 具有反应式扩展的动态级联序列,c#,.net,system.reactive,observable,rx.net,C#,.net,System.reactive,Observable,Rx.net,我想创建一个序列,该序列连接在运行时动态创建的一个或多个序列 我尝试使用mySequence=mySequence.ConcatanotherSequence,但这会中断当前对mySequence的订阅,因为每次都会创建一个新序列。将一个可观察序列连接到另一个序列时,第一个序列必须在从第二个序列获得任何值之前结束。听起来更像是要合并两个或多个序列——换句话说,只要序列生成值,就从任何序列中获取值 因此,如果您允许我将.Concat更改为.Merge,听起来您现在有这样的代码: IObservab

我想创建一个序列,该序列连接在运行时动态创建的一个或多个序列


我尝试使用mySequence=mySequence.ConcatanotherSequence,但这会中断当前对mySequence的订阅,因为每次都会创建一个新序列。

将一个可观察序列连接到另一个序列时,第一个序列必须在从第二个序列获得任何值之前结束。听起来更像是要合并两个或多个序列——换句话说,只要序列生成值,就从任何序列中获取值

因此,如果您允许我将.Concat更改为.Merge,听起来您现在有这样的代码:

IObservable<long> mySequence = Observable.Interval(TimeSpan.FromSeconds(0.5)).Take(5);
IDisposable mySequenceSubscription = mySequence.Subscribe(n => Console.WriteLine(n));
IObservable<long> anotherSequence = Observable.Interval(TimeSpan.FromSeconds(0.2)).Take(5);
mySequence = mySequence.Merge(anotherSequence);
如果运行该命令,我将获得以下值:

0 1 2 3 4 第二个序列未合并

现在,如果您在创建订阅时不知道要合并的未来可观察对象是什么,那么您可以这样做:

Subject<IObservable<long>> sources = new Subject<System.IObservable<long>>();
IDisposable sourceSubscription = sources.Merge().Subscribe(n => Console.WriteLine(n));

sources.OnNext(Observable.Interval(TimeSpan.FromSeconds(0.5)).Take(5));
sources.OnNext(Observable.Interval(TimeSpan.FromSeconds(0.2)).Take(5));
现在,结果如下所示:

0 1 0 2 3 4 1 2 3 4
这已正确地将订阅后添加的两个观察值合并在一起。简单。

当您将一个可观察序列连接到另一个序列时,第一个序列必须在您从第二个序列获得任何值之前结束。听起来更像是要合并两个或多个序列——换句话说,只要序列生成值,就从任何序列中获取值

因此,如果您允许我将.Concat更改为.Merge,听起来您现在有这样的代码:

IObservable<long> mySequence = Observable.Interval(TimeSpan.FromSeconds(0.5)).Take(5);
IDisposable mySequenceSubscription = mySequence.Subscribe(n => Console.WriteLine(n));
IObservable<long> anotherSequence = Observable.Interval(TimeSpan.FromSeconds(0.2)).Take(5);
mySequence = mySequence.Merge(anotherSequence);
如果运行该命令,我将获得以下值:

0 1 2 3 4 第二个序列未合并

现在,如果您在创建订阅时不知道要合并的未来可观察对象是什么,那么您可以这样做:

Subject<IObservable<long>> sources = new Subject<System.IObservable<long>>();
IDisposable sourceSubscription = sources.Merge().Subscribe(n => Console.WriteLine(n));

sources.OnNext(Observable.Interval(TimeSpan.FromSeconds(0.5)).Take(5));
sources.OnNext(Observable.Interval(TimeSpan.FromSeconds(0.2)).Take(5));
现在,结果如下所示:

0 1 0 2 3 4 1 2 3 4
这已正确地将订阅后添加的两个观察值合并在一起。很简单。

如果以后要删除其中一个源,该怎么办?这有可能吗?@EduardoBrites-是的,只需结束来源。使用TakeUntil或Take的其他变体是相当容易的。如果以后要删除其中一个源呢?这有可能吗?@EduardoBrites-是的,只需结束来源。使用TakeUntil或Take的其他变体相当容易。