我相信有很多方法可以做到这一点。
我在这里有一个经过测试的示例
void Main()
{
var scheduler = new TestScheduler();
var stream = scheduler.CreateColdObservable(
ReactiveTest.OnNext(1.Seconds(), 'A'),
ReactiveTest.OnNext(2.Seconds(), 'B'),
ReactiveTest.OnNext(13.Seconds(), 'C')
);
var observer = scheduler.CreateObserver<string>();
var query = stream.Publish(s => {
return s.Timeout(TimeSpan.FromSeconds(10), Observable.Empty<char>(), scheduler)
.ToList()
.Where(buffer=>buffer.Any())
//Project to string to make equality test easier for the example.
.Select(buffer=>string.Join(",", buffer))
.Repeat();
});
query.Subscribe(observer);
scheduler.AdvanceBy(100.Seconds());
ReactiveAssert.AreElementsEqual(
new []{
ReactiveTest.OnNext(12.Seconds(), "A,B"),
ReactiveTest.OnNext(23.Seconds(), "C")
},
observer.Messages);
}
// Define other methods and classes here
public static class TimeEx
{
public static long Seconds(this int seconds)
{
return TimeSpan.FromSeconds(seconds).Ticks;
}
}
请注意,我只是将 Buffered 列表设为字符串,以便更轻松地验证相等性。即"A,B" 而不是{'A', 'B'}
要考虑的其他选项是 Window 或 GroupJoin 运算符来执行此操作 - 请参阅 http://www.introtorx.com/content/v1.0.10621.0/17_SequencesOfCoincidence.html。我确信可以将其他运算符拼接在一起,例如Switch、Select、Timer、Timeout 等以获得您的结果。