我有一种情况,我希望对可观察的样本进行采样,但在给定特定条件的情况下,我想接受每个事件。这是我的尝试,但我有一种感觉,由于不断重新订阅主序列,这是不安全的。例如,如果采样不断打开和关闭,并且主序列总是在订阅上生成一个值,那么我想我会一直收到重复的事件。
IObservable<T>
SampleMaybe<T>
( this IObservable<T> @this
, IObservable<<IObservable<T>>> sample
)
{
return sample
.Select(s => s != null ? @this.Sample(s) : @this)
.Switch();
}
最佳答案
我不确定您的 .Sample(s)
调用。我认为三元运算符的两侧最终是相同的。
话虽如此,我认为您最初的方法是可靠的,只要订阅没有副作用。这是一个维护订阅的示例,因此您甚至可以避免这种情况:
public static IObservable<T> SampleSometimes<T>(this IObservable<T> source, TimeSpan sampleTime, IObservable<bool> isSamplingOn)
{
return source.Publish(_source => _source
.Sample(sampleTime)
.Publish( _sampled => isSamplingOn
.Select(b => b? _sampled : _source)
.Switch()
)
);
}
关于c# - 如何使用 Rx.Net 编写条件样本组合器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42899093/