给定一个类:
class Foo { DateTime Timestamp {get; set;} }
...和IObservable<Foo>
,有保证的单调递增 Timestamp
s,我怎样才能生成一个IObservable<IList<Foo>>
根据这些分块到列表中Timestamp
s?
IE。每个IList<Foo>
应该有五秒钟的事件,或者其他什么。我知道我可以使用Buffer
with a TimeSpan
超载,但我需要从事件本身而不是挂钟中获取时间。 (除非有一种巧妙的方法来提供IScheduler
这里使用的是IObservable
本身作为源.Now
?)
如果我尝试使用Observable.Buffer(this IObservable<Foo> source, IObservable<Foo> bufferBoundaries)
像这样重载:
IObservable<Foo> foos = //...;
var pub = foos.Publish();
var windows = pub.Select(x => new DateTime(
x.Ticks - x.Ticks % TimeSpan.FromSeconds(5).Ticks)).DistinctUntilChanged();
pub.Buffer(windows).Subscribe(x => t.Dump())); // linqpad
pub.Connect();
...然后IList
实例包含导致窗口关闭的项目,但我真的希望这个项目进入下一个窗口/缓冲区。
例如。带时间戳[0, 1, 10, 11, 15]
你会得到块[[0], [1, 10], [11, 15]]
代替[[0, 1], [10, 11], [15]]