【问题标题】:How do I turn an IObservable<IObservable<T>> into an IObservable<IEnumerable<T>>?如何将 IObservable<IObservable<T>> 变成 IObservable<IEnumerable<T>>?
【发布时间】:2016-07-04 18:16:13
【问题描述】:

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

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

然后我 Window 这给了我一个 observable 的 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&lt;IObservable&lt;Point&gt;&gt; 转换为IObservable&lt;IEnumerable&lt;Point&gt;&gt;

【问题讨论】:

  • 你能不使用拖放,并从BeginDragEndDrag eventArgs 中提取坐标吗?
  • @BarryO'Kane 我正在使用 MonoGame 的鼠标 API。
  • 啊,很公平。我的坏:)

标签: c# system.reactive rx.net


【解决方案1】:

将您的 Window 运算符更改为 Buffer 运算符 (this overload).

运算符产生IObservable&lt;IList&lt;T&gt;&gt;,其中IList属于IEnumerable


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

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

【讨论】:

  • 对不起,我没有在我的问题中提到我在其他地方使用leftMouseDrag,所以我想保持不变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多