C# 使用RX压缩重复流
我有两个热观测,我不想错过任何通知 第一个可观察到的产生数字 1-2-3-4 和第二串 a-b 我正在寻找一种方法来压缩它们以产生下一个输出 a-1 b-2 a-3 b-4 a-5 所以我想要的是无限期地重复第二个流,直到第一个流被取消订阅。我尝试了类似于下一个测试的方法,该方法可以产生所需的输出。但是,我不会永远重复,因为我不知道如何停止以测试结果。此外,我还使用了一个C# 使用RX压缩重复流,c#,system.reactive,rx.net,C#,System.reactive,Rx.net,我有两个热观测,我不想错过任何通知 第一个可观察到的产生数字 1-2-3-4 和第二串 a-b 我正在寻找一种方法来压缩它们以产生下一个输出 a-1 b-2 a-3 b-4 a-5 所以我想要的是无限期地重复第二个流,直到第一个流被取消订阅。我尝试了类似于下一个测试的方法,该方法可以产生所需的输出。但是,我不会永远重复,因为我不知道如何停止以测试结果。此外,我还使用了一个ReplaySubject,这是我手动完成的,这意味着我无法接收任何新通知 class MyClass:Reactiv
ReplaySubject
,这是我手动完成的,这意味着我无法接收任何新通知
class MyClass:ReactiveTest{
[Fact]
public void MethodName4() {
var strings = new ReplaySubject<string>();
var testScheduler = new TestScheduler();
testScheduler.Schedule("", TimeSpan.FromTicks(10), (scheduler, s) => {
strings.OnNext("a");
strings.OnNext("b");
strings.OnCompleted();
});
var numbers = testScheduler.CreateHotObservable(OnNext(100, 1), OnNext(200, 2), OnNext(300, 3), OnNext(400, 4), OnNext(500, 5));
numbers.Zip(Observable.Defer(() => strings).Repeat(3), (i, s) => (i, s)).Subscribe();
testScheduler.AdvanceBy(500);
}
}
class MyClass:ReactiveTest{
[事实]
public-void-MethodName4(){
var strings=新的ReplaySubject();
var testScheduler=newtestscheduler();
testScheduler.Schedule(“,TimeSpan.FromTicks(10),(scheduler,s)=>{
strings.OnNext(“a”);
字符串。OnNext(“b”);
strings.OnCompleted();
});
var numbers=testScheduler.CreateHotObservable(OnNext(100,1)、OnNext(200,2)、OnNext(300,3)、OnNext(400,4)、OnNext(500,5));
numbers.Zip(Observable.Defer(()=>字符串)。重复(3),(i,s)=>(i,s)).Subscribe();
testScheduler.AdvanceBy(500);
}
}
我想我找到了一个解决方案,我将尝试描述一下
重复热观测是没有意义的,因为它永远不会完成。然而,你可以重复这个热观测的窗口。我从@Enigmativity重构了它,以重复所有值,而不是最后一个值
public static IObservable<T> RepeatAllDuringSilence<T>(this IObservable<T> source, TimeSpan maxQuietPeriod,
IScheduler scheduler=null, IObservable<T> inner=null) {
if (scheduler==null)
scheduler=Scheduler.Default;
if (inner == null)
inner = source;
return Observable.Create<T>(observer => {
var replay = inner.Replay(scheduler);
var sequence = source.Select(x => Observable.Interval(maxQuietPeriod, scheduler).SelectMany(l => replay).StartWith(x)).Switch();
return new CompositeDisposable(replay.Connect(), sequence.Subscribe(observer));
});
}
(1,a)(2,b)
(3,c)
(4,a)
(5,b)
这难道不能解决你的问题吗
void TestMergedPairs()
{
var source1 = Observable.Range(1,9999);
var source2 = Observable.Range(65, 2).Repeat();
var z = source1.Zip(source2,(x,y)=> { return new { left = x, right = y }; })
.TakeWhile((v)=>v.left<1000);
z.Subscribe(x => { Console.WriteLine( x.left +" "+x.right ); });
}
void TestMergedPairs()
{
var source1=可观测范围(19999);
var source2=可观察的范围(65,2).Repeat();
var z=source1.Zip(source2,(x,y)=>{returnnew{left=x,right=y};})
.TakeWhile((v)=>v.left{Console.WriteLine(x.left+“”+x.right);});
}
如果不是,那么就不清楚你的问题是什么。如果您希望能够不断重复第二个可观察对象的历史内容,也就是说,您的“a”、“b”以后可能会变成“a”、“b”、“c”,然后应该迭代3个字母的序列,那么您的源可能是聚合历史窗口的.Scan的结果。谢谢您的回答,你的假设符合我的要求。然而,正如我在最初的博文中所写的那样,当使用
主题时,如果范围是可以观察到的,而不是冷的,那么Repeat
操作符什么也不做。我很感激你能提供一个解决方案,使用我的原始帖子中的两个流,通过查看我发布的答案,更好地描述这个案例。因此,为了澄清,你希望你的字符串是热的,并且你希望“到目前为止的历史”不断重复(与数字流压缩)?例如,如果您的字符串observable有一个“a”,“b”的历史记录,它应该用数字压缩它,直到下一个“c”到达,然后再用{“a”,“b”,“c”}压缩。重复?我了解你的问题吗?确切地说,数字也很热门
void TestMergedPairs()
{
var source1 = Observable.Range(1,9999);
var source2 = Observable.Range(65, 2).Repeat();
var z = source1.Zip(source2,(x,y)=> { return new { left = x, right = y }; })
.TakeWhile((v)=>v.left<1000);
z.Subscribe(x => { Console.WriteLine( x.left +" "+x.right ); });
}