(使用the Zip operator in Reactive Extensions (Rx))
var xyZipped = xStream.Zip(yStream, (x, y) =>
{
Debug.WriteLine("Latest Pair Has Arrived");
return new List<SomeType> { x, y };
});
但是如何在每个流中引入两个值之间的最大允许时间间隔,这样如果超过了值间隔,则不会从xyZipped
输出任何值
如果在两个值之间经过太长时间,那么配对也应该重置,即在超时后发生另一个配对,应在每个流中产生一个新值(不只是一个。)
或者使用不同的运算符/实现来实现这种流逻辑会更好吗?
答案 0 :(得分:1)
您可以使用Rx组合器。因为,您的主要目标是Zip
,让我们从Zip
开始,然后应用您的到期条件。
public static IObservable<TOut> ZipWithExpiry<TLeft, TRight, TOut>(
IObservable<TLeft> left,
IObservable<TRight> right,
Func<TLeft, TRight, TOut> selector,
TimeSpan validity)
{
return Observable.Zip(left.Timestamp(), right.Timestamp(), (l, r) => Tuple.Create(l, r))
.Where(tuple => Math.Abs((tuple.Item1.Timestamp - tuple.Item2.Timestamp).TotalSeconds) < validity.TotalSeconds)
.Select(tuple => selector(tuple.Item1.Value, tuple.Item2.Value));
}
如果要检查流中的相邻值,可以使用TimeInterval
运算符而不是Timestamp
重写它。