RX-如何订阅条件状态,但仅当此状态在x时段内不变时才订阅?

yos*_*rel 5 c# system.reactive

您知道如何订阅保持x时间的状态吗?

例如,如果我具有BehaviorSubject<int>表示0到100之间的int值,并且该值随时间而变化,那么我想在该值小于50时连续10秒订阅。

如果该值暂时变回50以上,然后又下降50,我想再数10秒钟。我怎样才能做到这一点?

非常感谢!

Eni*_*ity 6

这是一个相当简洁的可观察查询,对我来说似乎正常工作:

var below50longerthan10seconds =
    subject
        .Select(x => x < 50)
        .DistinctUntilChanged()
        .Select(x =>
            Observable.Delay(
                Observable.Return(x),
                TimeSpan.FromSeconds(10.0)))
        .Switch()
        .Where(x => x)
        .Select(x => Unit.Default);
Run Code Online (Sandbox Code Playgroud)

这是细分。

true小于50时将值从0更改为100 ,false否则:

        .Select(x => x < 50)
Run Code Online (Sandbox Code Playgroud)

仅保留true&之间的实际更改false

        .DistinctUntilChanged()
Run Code Online (Sandbox Code Playgroud)

将值投影到新的可观察对象中,该可观察对象将延迟10秒:

        .Select(x =>
            Observable.Delay(
                Observable.Return(x),
                TimeSpan.FromSeconds(10.0)))
Run Code Online (Sandbox Code Playgroud)

现在执行.Switch()-如果一个新x的延迟可观察值之前出现一个新值,则它将被忽略,因为一个新的延迟可观察值即将到来:

        .Switch()
Run Code Online (Sandbox Code Playgroud)

仅选择true原始流低于50时的含义:

        .Where(x => x)
Run Code Online (Sandbox Code Playgroud)

选择Unit.Default仅是因为有一个true没有任何false值的值流很奇怪:

        .Select(x => Unit.Default);
Run Code Online (Sandbox Code Playgroud)

因此,现在您有了一个IObservable<Unit>当原始流产生的值小于50且在10秒内不会产生大于或等于50的值时释放新值的。

那是你想要的吗?


yos*_*rel 4

我希望我不会错过任何东西,但我认为最简单的方法是:

BehaviorSubject<int> value = new BehaviorSubject<int>(0);

value.Select(v => v < 50).DistinctUntilChanged().Throttle(TimeSpan.FromSeconds(10))
.Where(x => x).Subscribe(b => DoSomething());
Run Code Online (Sandbox Code Playgroud)

Enigmativity的答案让我开始了解如何处理这个问题。谢谢!