如何编写此方法?
public static IObservable<T> IncreasingSubsequence<T>(this IObservable<T> observable, IComparer<T> comparer)
{
// ???
}
产生的observable应仅推送超过所有先前值的最大值。
答案 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;
});
}