如何获得 IObservable 的最后已知值?

How do I get the last known value of an IObservable?

假设我正在使用 Rx.Net 构建图像编辑器。用户可以使用鼠标操作 canvas。应用的操作取决于当前选择的工具。例如,可能有一个 "draw" 工具和一个 "erase" 工具。一次只能选择一个工具。

我有三个流;一个用于鼠标事件;一个用于通过单击鼠标发出的命令;另一个用于工具选择:

IObservable<ITool> toolSelection;
IObservalbe<MouseState> mouse;
IObservable<ICommand> commands;

commands 流依赖于其他两个:当用户单击鼠标时发出命令,生成的命令取决于最后选择的工具。请注意,当用户更改工具时,应该 而不是 发出命令,只有当他们单击鼠标时。

现在,我可以将最后选择的工具存储在这样的变量中:

var selectedTool = defaultTool;
toolSelection.Subscribe(x => selectedTool = x);

我可以使用 selectedTool 构建 commands 流:

var commands = mouse.Select(x => selectedTool.CreateCommand(x));

但是,这似乎不像 "reactive" 做事的方式。我可以使用流组合实现同样的逻辑吗?

我查看了 CombineLatest,但它会导致在用户切换工具时生成不需要的事件。我只希望在用户单击时发出命令。

It sounds like you need .Switch().

Try this code:

IObservable<ICommand> commands =
    toolSelection
        .Select(t => mouse.Select(m => t.CreateCommand(m)))
        .Switch();

The extension method .Switch() takes, in this case, an IObservable<IObservable<ICommand>> and turns it into an IObservable<ICommand> by taking the latest observable produced by the outer observable and only producing values from it and disposing of previous ones.

Or, in more English terms, whenever the user clicks on a new tool you get a stream of mouse commands built using only the latest tool in one nice query.