Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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# 使用RX压缩重复流_C#_System.reactive_Rx.net - Fatal编程技术网

C# 使用RX压缩重复流

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

我有两个热观测,我不想错过任何通知

第一个可观察到的产生数字

1-2-3-4

和第二串

a-b

我正在寻找一种方法来压缩它们以产生下一个输出

a-1 b-2 a-3 b-4 a-5

所以我想要的是无限期地重复第二个流,直到第一个流被取消订阅。我尝试了类似于下一个测试的方法,该方法可以产生所需的输出。但是,我不会永远重复,因为我不知道如何停止以测试结果。此外,我还使用了一个
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 ); });
    }