c# - .Net Rx 一段时间内的第一项和最后一项
问题描述
我们有一个用户可以拖动的图表。在鼠标移动时,我们有一个事件,它设置了一个属性,用新旧值触发 OnNext(这在其他地方需要)。
public double Value
{
get { return _value; }
set
{
if(ShouldUpdate && value!=_value)
_subject.OnNext(factoryMethod(this, value, _value, Index));
_value = value;
}
}
我需要得到拖动的第一个和最后一个项目。通过最后一项,我假设事件之间是否有 250 毫秒的暂停。
即用户开始拖动第一个事件正在存储下一个事件即将到来。当他停止拖动并且在 250 毫秒内没有出现新事件时,将调用一个订阅,其中包含第一个和最后一个元素的列表。当用户开始再次拖动时,新的第一个和最后一个正在创建(我不关心旧值)。
解决方案
好的,经过更多查找和调整现有示例后,我设法提出了一个似乎可行的解决方案。
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);
});
}
推荐阅读
- javascript - 如何发送一切正常的松弛响应,操作超时错误
- asp.net-web-api - Swagger:使用 IMultipleExamplesProvider 和 Swashbuckle.AspNetCore.Filters .net core web Api 3.1 生成多个示例
- reactjs - 如何在 Draft.js 中通过更改字体系列样式来设置按钮颜色
- node.js - 为什么即使我已经安装了我需要的一切,我也不能在 Angular 上创建项目?
- javascript - 如何在 JS 中过滤 firebase 文档中的数据并在 Promise 中获取 PromiseResult
- java - 与顺序执行多个查询相比,使用 addBatch() 和 executeBatch() 有什么优势吗?
- php - 如何在 php 中输入提示生成器?
- url - 在 Power BI 报表服务器 URL 中传递筛选器参数(本地)
- excel - 如何在 Excel 中查找最常见的列组合
- android - 默认 FirebaseApp 未在此过程 com.example.composecourseyt 中初始化。确保首先调用 FirebaseApp.initializeApp(Context)