什么是Rx中的Run和Do之间的区别?

Jon*_*ter 9 c# system.reactive

旧版本的Reactive Extensions同时具有IEnumerable的Run和Do扩展方法.他们似乎都在做同样的事情,我不确定其中的区别.

我问,因为我正在升级一些旧的代码,Do已经转移到Ix(尚未发布稳定的版本),看起来Run已被ForEach取代.

Jud*_*ngo 11

Do指定执行时会发生一些副作用,并返回带有副作用的序列.

运行枚举序列,并返回void.

可以这样想:用副作用"标记"序列.只有在枚举序列时才会发生这些副作用.返回带有副作用的新序列.

// Example of .Do
var elements = new[] { 1, 2, 3 };
var elementsWithSideEffects = elements.Do(e => MessageBox.Show(e)); // No Message Boxes shown yet!
elementsWithSideEffects.Run(); // 3 message boxes shown
Run Code Online (Sandbox Code Playgroud)

另一方面,运行枚举序列:Run(),或者可选地附加副作用,然后枚举序列:Run(action)

// Example of .Run with its own side effects:
var elements = new[] { 1, 2, 3 };
elements.Run(e => MessageBox.Show(e)); // 3 Message Boxes shown.
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的数组声明后需要一个`AsObservable()`(否则它在`IEnumerable`上运行). (2认同)

Ric*_*lay 8

您可以将其Do视为"Peek",因为它为每个值/错误/完成执行副作用但不能更改它们的值,因为lambdas传递了所有返回void.它类似于Subscribe,但它不会破坏monad("链"),因为它返回IObservable<T>.Do通常用于记录.

Run基本上是阻塞版本Subscribe,意味着在调用OnComplete/OnError之前执行不会继续超过该行.


小智 6

将Do视为Amp仪表:切断电路(查询运算符链)并为当前(流经查询运算符的值)连接仪表(动作委托).对于流过电路的每个电子(值)(查询),仪表(动作)执行一些工作.请注意,电路(查询)仍然处于断电状态(懒惰).直到你插入电池(运行一个foreach循环),电流(值)才会流动.打开电路(运行查询)的一种简单方法是使用电池(ForEach运算符).