将值与值之间的最大时间间隔组合在一起

时间:2012-01-25 15:58:27

标签: c# .net linq system.reactive

(使用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输出任何值

  • 如果在两个值之间经过太长时间,那么配对也应该重置,即在超时后发生另一个配对,应在每个流中产生一个新值(不只是一个。)

  • 或者使用不同的运算符/实现来实现这种流逻辑会更好吗?

1 个答案:

答案 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重写它。