旧版本的Reactive Extensions同时具有IEnumerable的Run和Do扩展方法。他们似乎都在做同样的事情,我不确定其中的区别。
我问,因为我正在升级一些旧的代码,Do已经转移到Ix(尚未发布稳定版本),看起来Run已被ForEach取代。
答案 0 :(得分: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(),或者可选地附加副作用,然后枚举序列: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.
答案 1 :(得分:8)
您可以将Do
视为“Peek”,因为它会为每个值/错误/完成执行副作用,但由于lambdas传递所有返回void,因此无法更改其值。它与Subscribe
类似,但它不会破坏monad(“链”),因为它返回IObservable<T>
。 Do
通常用于记录。
Run
基本上是Subscribe
的阻止版本,这意味着在调用OnComplete / OnError之前执行不会继续超过该行。
答案 2 :(得分:6)
将Do视为Amp仪表:切断电路(查询运算符链)并为当前(流经查询运算符的值)连接仪表(动作委托)。对于流过电路的每个电子(值)(查询),仪表(动作)执行一些工作。请注意,电路(查询)仍然处于断电状态(懒惰)。直到你插入电池(运行一个foreach循环),电流(值)才会流动。打开电路(运行查询)的一种简单方法是使用电池(ForEach操作员)。
答案 3 :(得分:3)
像其他LINQ运算符一样行为,如Select或Where - 如果你只使用它就没有任何反应,你需要foreach
才能发生。 Run / ForEach / Subscribe与foreach
语句类似,立即执行。
如果你不是100%明确何时使用每一个,请避免使用并且只使用ForEach / Run。