2012-01-04 14 views
9

Reactive Extensionsの古いバージョンには、IEnumerableの実行方法と実行方法の両方がありました。彼らはどちらもまったく同じことをしているように見えますが、私はその違いを確信していません。RxのRunとDoの違いは何ですか?

私はいくつかの古いコードをアップグレードしていますが、DoはIx(まだ安定版ではありません)に移動されているため、実行がForEachに置き換えられているように見えます。

+0

ジョナサン、答えのいずれかがあなたを助けましたか?その場合は、回答としてマークしてください。ありがとう! –

+1

新しいRxビルドの "Run"に相当するのは、Observable.Wait()拡張メソッドです。このメソッドは、観測可能なソースから最終値または例外が受け取られるまで実行をブロックします。それを呼び出すと、サブスクリプションが発生します。 – thefellow3j

答えて

10

Doは、実行時にいくつかの副作用が発生することを指定し、副作用のあるシーケンスを返します。

実行はシーケンスを列挙し、voidを返します。

このように考える:副作用でシーケンスに「タグ付けする」。これらの副作用は、配列が列挙されている場合にのみ発生します。 Doは副作用のある新しいシーケンスを返します。

// 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 

実行は、他の一方で、シーケンス列挙する:ファイル名を指定して実行()、または必要に応じて副作用を添付し、その後、シーケンスを列挙:ファイル名を指定して実行(アクション)が

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

配列宣言の後に 'AsObservable()'が必要だと思います。そうでなければ、 'IEnumerable'を実行しています。 –

+0

Erm、私が間違っていないと、.Doと.RunはIEnumerable で動作する対話拡張(IX)の一部です。 –

+0

'Do'はまだIEnumerableとIObservableの両方にあります。 'Run' *はWP7リリースの両時点で*でしたが、現在はIxの一部としてのみ利用可能です。そう言えば、私は今OPが実際にIEnumerableを指していて、IObservableを指していなかったことを認識しています。混乱の謝罪 –

8

はあなたのようにDoと考えることができます値/エラー/補完ごとに副作用を実行するが、ラムダがすべて渡されたので値を変更することはできないため、「Peek」はvoidを返す。 Subscribeと似ていますが、IObservable<T>を返すので、モナド( "チェーン")を壊さない。 Doはロギングによく使用されます。

Runは、基本的にはブロック型のSubscribeです。つまり、OnComplete/OnErrorが呼び出されるまで実行が継続されません。

+0

華麗な答えは、これは私のためにペニードロップを作った。 – Contango

6

Do not an Amp meter:回路(クエリ演算子の連鎖)を切り、電流(クエリー演算子を流れる値)のメーター(アクションデリゲート)を配線します。回路(クエリー)を流れるすべての電子(値)に対して、メーター(アクション)は何らかの作業を行います。回線(クエリー)の電源がまだオフ(怠惰)であることに注意してください。電流(値)が流れているのは、バッテリーを接続する(foreachループを実行する)までではありません。回路をオンにする(クエリを実行する)簡単な方法は、バッテリ(ForEach演算子)を使用することです。

+0

私はあなたの類推が好きですが、ForEachは負荷でバッテリーではありません:)回路が開くまで、何も起こりません。 –

3

Doは、SelectやWhereのような他のLINQ演算子と同じように動作します。使用すると何も起こりません。何か起こるためにはforeachが必要です。 Run/ForEach/Subscribeはforeachステートメントのように動作し、すぐに実行されます。

それぞれを使用するタイミングを100%明確にしていない場合は、Doを避けてForEach/Runを使用してください。

関連する問題