如何从IObservable <t> </t>中选择增加值的子序列

时间:2011-07-10 22:10:29

标签: c# .net system.reactive

如何编写此方法?

public static IObservable<T> IncreasingSubsequence<T>(this IObservable<T> observable, IComparer<T> comparer)
{
    // ???
}

产生的observable应仅推送超过所有先前值的最大值。

2 个答案:

答案 0 :(得分:10)

另一种方法是使用Scan和DistinctUnitChanged。这是一个使用简单的示例

的示例
IObservable<int> xs;
xs.Scan((last,cur) => cur > last ? cur : last).DistinctUntilChanged()

和更一般的形式

public static IObservable<T> IncreasingSubsequence<T>(this IObservable<T> xs, IComparer<T> comp)
{
    return xs.Scan((last,cur) => comp.Compare(cur, last) == 1 ? cur : last)
                     .DistinctUntilChanged();
}

答案 1 :(得分:1)

我认为最简单的方法是使用Where()以及闭包是可变的这一事实:

public static IObservable<T> IncreasingSubsequence<T>(
    this IObservable<T> observable, IComparer<T> comparer = null)
{
    if (observable == null)
        throw new ArgumentNullException("observable");
    if (comparer == null)
        comparer = Comparer<T>.Default;
    T max = default(T);
    bool first = true;
    return observable.Where(x =>
    {
        if (first)
        {
            first = false;
            max = x;
            return true;
        }
        if (comparer.Compare(x, max) > 0)
        {
            max = x;
            return true;
        }
        return false;
    });
}