2013-06-06 12 views

답변

7

간단한 대답 - 사용 ToObservable. 그것이 바로 그 때문입니다.

"실제 질문에 대답"대답은 - 당신이 사용하지 않도록 할 수 SubjectsObservable.Create를 통해 :

void Main() 
{ 
    var src = Enumerable.Range(0, 10); 
    var observable = Observable.Create<int>(obs => 
    { 
     foreach(var item in src) 
     { 
      obs.OnNext(item); 
     } 
     return Disposable.Create(()=>{}); 
    }); 

    using(observable.Subscribe(Console.WriteLine)) 
    { 
     Console.ReadLine(); 
    } 
} 

출력 : 사람이 알 수없는 유형의 IEnumerable이있는 경우

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
+0

'Disposable.Create (() => {});은'Disposable.Empty'와 다른가요? – interlude

+1

@interlude 필자는 방금 과부하를 사용하여 필요할 경우 정리 논리를 추가 할 수있었습니다. – JerKimball

1

, 두 가지 방법 중 하나가 "IObservable로 변환"할 수 있습니다.

  • 오브젝트의 모든 데이터를 IObservable을 구현하는 새 콜렉션에 복사하십시오. 이 작업이 완료되면 새 콜렉션에 대한 변경 사항 만보고됩니다. 원본에 대한 변경 사항은 적용되지 않습니다.

  • 주기적으로 IEnumerable 내용의 스냅 샷을 찍을 새 개체를 만듭니다. 각 스냅 샷을 찍은 후 이전 스냅 샷에 적용해야 할 모든 변경 사항을보고하여 새 스냅 샷과 일치하게하십시오. 이 방법을 사용하면 원래 개체에 대한 변경 사항이 관찰되지만 결국 변경 사항이 없을 때 컬렉션을 반복적으로 읽는 데 많은 시간을 낭비하지 않고시기 적절하게 업데이트 알림을 제공하기가 어렵습니다. 하나는 IObservable 오히려 데이터의 복사본이 자동으로 입력하는 새로운 객체보다, 원래 IEnumerable 개체에 바인딩해야 할 필요가있을 때

몇 번있다; 그러한 경우 두 번째 접근법이 필요할 수 있습니다. 그러나 종종 원래의 컬렉션이 임의의 IEnumerable에서 사용할 수없는 기능을 지원하지 않는 한 허용되지 않는 시스템로드를 유발하지 않으면 서 적시에 업데이트를 제공 할 수있을만큼 폴링 속도를 빠르게 만들 수 없습니다. 또한 IEnumerable 유형에 대한 요구 사항을 부과하지 않으면 업데이트 될 수있는 스레딩 컨텍스트에 제한을 가할 수 있습니다.