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的其他变体相当容易。