我希望输出序列的事件尽快发生,但不在从最近事件开始的 N 秒窗口内发生。
这是一个大理石图,假设我想在事件之间至少分隔三个破折号:
Input: a-------b-cd-----e---------f-----g-h
Result: a-------b---c---d---e------f-----g---h
签名为:
IObservable<T> Separate<T>(this IObservable<T> source, TimeSpan separation);
最佳答案
严重依赖@ibebbs 的回答,我已经使用测试来查看是否有更简单的方法。
就在我编写代码之前,我看到了一些已编码到测试中的假设。但是,我不知道是否需要这些断言。特别是 OnCompleted 时间。 @ibebbs 断言 OnCompleted
应该出现在与最后一个值相同的帧中。 OP 没有提出这样的要求。
如果这不是必需的,那么您可以采用完全不同的方法。
当我看到你的大理石图时,我从输入到结果的心理翻译如下
Input: a-------b-cd-----e---------f-----g-h
a---|
b--|
c--|
d--|
e--|
Result: a-------b---c---d---e------f-----g---h
即每个值都被投影到一个新的具有长尾的单值序列。也就是说,直到给定的缓冲时间,它才会完成。这使得代码就像从单个值到具有单个值和延迟完成的序列的投影一样简单。然后你只需将所有这些迷你序列连接在一起
public static IObservable<T> Separate<T>(this IObservable<T> source, TimeSpan separation, IScheduler scheduler)
{
var delayedEmpty = Observable.Empty<T>().Delay(separation, scheduler);
return source.Select(s=>
Observable.Return(s).Concat(delayedEmpty)
).Concat();
}
这将解决 OP,但是您也会在完成序列时获得与为每个值获得的相同的缓冲区。
关于c# - 如何让事件至少间隔一个给定的时间跨度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40235683/