c# - 缓冲区后重置不同

标签 c# system.reactive

所以我有这样的字符串流:

ABA        ABCA
+--------+-------+ 
0        1       2 s

我想获取不同的值,将它们缓冲一秒钟,然后再次执行此操作。所以我想要上图所示的两组数据:

AB 和 ABC

我从这个开始:

void Main()
{
    var subject = new Subject<string>();

    var subscription = subject 
    .Distinct()
    .Buffer(TimeSpan.FromSeconds(1))
    .Subscribe(eg => 
        {
            eg.Dump();
        }
    );

    subject.OnNext("A");
    subject.OnNext("B");
    subject.OnNext("A");

    Console.ReadLine();

    subject.OnNext("A");
    subject.OnNext("B");
    subject.OnNext("C");
    subject.OnNext("A");

    Console.ReadLine();

    subscription.Dispose();
}

但是在我在第一个 Console.ReadLine() 输入一行之前输出 AB,然后再输入 C。

我想要的是在每个缓冲期后重置 Distinct() 运算符。这可能吗?

我当然可以做到这一点并使其正常工作:

var subscription = subject 
   .Buffer(TimeSpan.FromSeconds(2))
   .Select(s => s.Distinct())
   .Subscribe(eg => 
    {
        eg.Dump();
    });

但我想知道是否可以使用 Rx 运算符来完成。

最佳答案

您最后得到的解决方案应该可以正常工作。如果您想继续使用 IObservable 留在 Rx 领域,您应该切换到 Window运算符:

var subscription = subject
    .Window(TimeSpan.FromSeconds(1))
    .Select(o => o.Distinct())
    .Merge()
    .Subscribe(eg =>
        {
            eg.Dump();
        });

关于c# - 缓冲区后重置不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950382/

相关文章:

c# - 从 C# 将 BSTR 传递到 COM 函数的约定(COM 互操作)

.net - 带有 RX 扩展的 LINQ

c# - 将最新值与可观察流中的先前值相结合

c# - 有没有更简单的方法可以将多个可观察集合组合成一个可观察集合?

c# - Unity3d协程在while循环后停止

c# - 避免在另一个类中使用公共(public)方法?

javascript - Angularjs $http.post - 将参数作为 JSON 发送到 ASPX webmethod

scala - 使用 RxScala 进行响应式编程

c# - 在不停止序列的情况下处理 Reactive Extensions 中的异常

c# - 返回满足特定条件的列表元素