2012-02-28 32 views
0

それぞれにIObserverを持つアイテムのコレクションと、メッセージ(!)を生成するメッセージソースがあります。メッセージをフィルタリングし、それぞれに関連するもののみを送信します。項目。私はこれがSystem.Reactiveのlinqに適していると思う。以下の例である:ループ内に複数のIObserversを設定する方法

IObservable<Message> source; 
foreach(item in items) 
{ 
    var filtered = from msg in source 
        where msg.Id == item.Id 
        selct msg; 
    filtered.Subscribe(item.Sink); 
} 

問題はソースがメッセージを生成するとき、クエリがループの最後itemに関して評価されることです。したがって、itemが20の場合、各クエリはプロパティitemになります。20.

これを修正するにはどうすればよいですか?

答えて

2

はこれを試してみてください:

IObservable<Message> source; 
foreach(item in items) 
{ 
    var item2 = item; 
    var filtered = from msg in source 
       where msg.Id == item2.Id 
       selct msg; 
    filtered.Subscribe(item2.Sink); 
} 

私はそれが役立つかもしれないと思います。すべてが私が考えるスコープのためです。

ここで私はあなたのコードで起こると思います。 linqクエリが遅延評価されるため、クエリは常に変数itemを使用し、ループを入力すると、変数は最後にコレクションの最新のアイテムに設定されました。ループの始めに別の値に値を代入することで、各問合せは各反復で変更されないその変数に対して機能します。

+0

ありがとう、これは[this]と同じです(http://stackoverflow.com/q/8898925/337065) –

+0

はい、まさにそれです。 –

+1

私が覚えている限り、C#5の変更に対応しているサイドノートに。 – cyberzed

関連する問題