c# - 如何将 IObservable<IObservable<T>> 转换为 IObservable<IEnumerable<T>>?

标签 c# system.reactive rx.net

我有一个鼠标左键状态流:

var leftMouseButton = mouse.Select(x => x.LeftButton).DistinctUntilChanged();

然后我Window这给我一个 observable of observables 表示鼠标拖动:

var leftMouseDrag = mouse
    .Select(mouseState => new Point(mouseState.X, mouseState.Y))
    .DistinctUntilChanged()
    .Window(leftMouseButton.Where(x => x == ButtonState.Pressed), x => leftMouseButton.Where(y => y != x));

现在我想制作一个关于 leftMouseDrag 的流给出点列表。每次用户完成拖动(LMB 向下 -> 移动 -> LMB 向上)时,它应该触发鼠标移动经过的位置列表。

我如何获取 IObservable<IObservable<Point>>并将其变成 IObservable<IEnumerable<Point>>

最佳答案

更改您的 Window接线员到 Buffer运算符 ( this overload).

运算符生成 IObservable<IList<T>> , 其中IList属于 IEnumerable


基于 OP 评论的替代解决方案:

var leftMouseDragLists = leftMouseDrag.SelectMany(i => i.ToList());

关于c# - 如何将 IObservable<IObservable<T>> 转换为 IObservable<IEnumerable<T>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38181696/

相关文章:

c# - 包装 C++ 对象以用于 C# PInvoke 时的析构函数执行

c# - 将通知模板从应用程序后端注册到 Azure 通知中心

c# - 如何在 WPF 中为 Viewport3D 控件切换到线框显示模式?

c# - 使用 Rx,如何在我的订阅方法运行时忽略除最新值之外的所有值

c# - 如果有新项目到达,则中断当前项目的处理

c# - 如何从 IObservable<T> 选择递增的值子序列

c# - 为什么 IEnumerable.ToObservable 这么慢?

c# - 是否有可能使用 .NET Core 获取未在 EFCore 中提交的添加项?

c# - 响应式扩展 Enumerable.Range/Observable.FromAsync 上的 OperationCancelled 异常

c# - 如何将轮询系统变成 Rx.Net IObservable?