这里的问题(正如 Shlomo 提到的)是我们需要在事件发生t2
之前打开窗口。t1
不幸的是,这是不可能的,因为一旦我们到达事件,t1
我们已经过了需要在 中打开窗口的点t2
。
相反,我们可以做的是t2
使用 Delay() 将时间向前移动。如果我们将其抵消x
(之前的时间),我们可以将问题重新定义为“获取在打开和关闭t2
的窗口中发生的事件。我们可以使用 GroupJoin 来解决这个问题。t1
t1 + x + y
var scheduler = new HistoricalScheduler();
var t1 = Observable.Interval(TimeSpan.FromMilliseconds(200), scheduler)
.Select(l => (char)('A' + l));
var t2 = Observable.Interval(TimeSpan.FromMilliseconds(100), scheduler);
var x = TimeSpan.FromMilliseconds(100); //before time
var y = TimeSpan.FromMilliseconds(100); //after time
var delayedT2 = t2.Delay(x, scheduler);
var g = t1.GroupJoin(delayedT2 ,
_ => Observable.Timer(x + y, scheduler),
_ => Observable.Empty<Unit>(scheduler),
(a, b) => new { a, b}
);
scheduler.Start();
这给出了结果:
{ A, [1,2] }
{ B, [3,4] }
{ C, [5,6] }
这个结果仍然不是你所期望的。这是因为在您的示例t2
中,事件发生在完全相同的即时t1
事件中。在这种情况下,t1 + y
首先处理事件并在包含事件之前关闭窗口t2
。这意味着我们正在有效地获得(t1-01:00) <= t1 < (t1 + 01:00)
. 例如,窗口A
是 01:0000 - 02.9999... 这就是为什么3
不包括在 03:00 发生的原因。
y
只需在我们的时间中添加一个刻度,就可以将其修复为具有包容性
var y = TimeSpan.FromMilliseconds(100).Add(TimeSpan.FromTicks(1));