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

How do I turn an IObservable<IObservable<T>> into an IObservable<IEnumerable<T>>?

我有鼠标左键状态的流:

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());