2012-02-28 4 views
0

각각 IObserver가있는 항목 모음과 Messages (!)를 생성하는 메시지 소스가 있습니다. 메시지를 필터링하고 각 항목에 대해서만 보내고 싶습니다. 목. 나는 이것이 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 인 경우 각 검색어는 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

관련 문제