我有一个
例如,我期望
所以,我发现
然而,我还有一个问题:间隔时间取决于最后“采样”的值。我想编写一个操作符,像这样:
我尝试写了一下,但最终得到了一个复杂的结构,并且不能正常工作。我的问题是,我能否使用现有的运算符(即用一行代码)构建它?
IObservable
,它会在随机时间间隔内产生值,我想对这个序列进行节流。我发现Throttle
操作符的“节流”定义与我的不同。
Throttle
只有在指定的时间间隔没有声音时才会产生值(它会产生最后一个看到的值)。我认为节流应该是按照指定的时间间隔产生值(当然,除非有沉默)。例如,我期望
Observable.Interval(100).Select((_,i) => i).Throttle(200)
会产生偶数(除了任何性能/时间问题),因为我将其节流到“半速”。但是这个序列根本不产生任何值,因为从来没有长度为200的沉默期。所以,我发现
Sample
实际上执行了我想要的“节流”行为。Observable.Interval(100).Select((_,i) => i).Sample(200)
会产生(同样,除了任何性能/时间问题)偶数序列。然而,我还有一个问题:间隔时间取决于最后“采样”的值。我想编写一个操作符,像这样:
public static IObservable<T> Sample<T>(this IObservable<T> source, Func<T, TimeSpan> intervalSelector);
intervalSelector
参数确定下一个样本的时间间隔,第一个样本要么从第一个值开始,要么从另一个参数开始,我不在意。我尝试写了一下,但最终得到了一个复杂的结构,并且不能正常工作。我的问题是,我能否使用现有的运算符(即用一行代码)构建它?