.Net Rx 一段时间内的第一个和最后一个项目
.Net Rx First and last item in a period of time
我们有一个用户可以拖动的图表。在鼠标移动时,我们有一个设置 属性 的事件,该事件使用新值和旧值触发 OnNext(其他地方需要)。
public double Value
{
get { return _value; }
set
{
if(ShouldUpdate && value!=_value)
_subject.OnNext(factoryMethod(this, value, _value, Index));
_value = value;
}
}
我需要获取拖动的第一个和最后一个项目。根据最后一项,我假设事件之间是否有 250 毫秒的暂停。
即用户开始拖动第一个事件正在存储下一个事件即将到来。当他停止拖动并且在 250 毫秒内没有新事件出现时,将调用一个订阅,其中包含两个元素的列表 first 和 last。
当用户再次开始拖动时,将创建新的第一个和最后一个(我不关心旧值)。
好的,在查看和调整现有示例后,我设法想出了一个似乎可行的解决方案。
public static IObservable<IList<TSource>> FirstAndLast<TSource>(this IObservable<TSource> source, TimeSpan threshold)
{
return Observable.Create<IList<TSource>>((obs) =>
{
return source.GroupByUntil(_ => true,
g => g.Throttle(threshold).Select(_ => Unit.Default))
.SelectMany(i => i.ToList().Select(_=> new List<TSource> {_.First(), _.Last()}))
.Subscribe(obs);
});
}
我们有一个用户可以拖动的图表。在鼠标移动时,我们有一个设置 属性 的事件,该事件使用新值和旧值触发 OnNext(其他地方需要)。
public double Value
{
get { return _value; }
set
{
if(ShouldUpdate && value!=_value)
_subject.OnNext(factoryMethod(this, value, _value, Index));
_value = value;
}
}
我需要获取拖动的第一个和最后一个项目。根据最后一项,我假设事件之间是否有 250 毫秒的暂停。
即用户开始拖动第一个事件正在存储下一个事件即将到来。当他停止拖动并且在 250 毫秒内没有新事件出现时,将调用一个订阅,其中包含两个元素的列表 first 和 last。 当用户再次开始拖动时,将创建新的第一个和最后一个(我不关心旧值)。
好的,在查看和调整现有示例后,我设法想出了一个似乎可行的解决方案。
public static IObservable<IList<TSource>> FirstAndLast<TSource>(this IObservable<TSource> source, TimeSpan threshold)
{
return Observable.Create<IList<TSource>>((obs) =>
{
return source.GroupByUntil(_ => true,
g => g.Throttle(threshold).Select(_ => Unit.Default))
.SelectMany(i => i.ToList().Select(_=> new List<TSource> {_.First(), _.Last()}))
.Subscribe(obs);
});
}