如何将IEnumerable转换为IObservable?

我想在不使用Rx ToObservable()和ToEnumerable()方法的情况下将IEnumerable集合转换为IObservable集合。

简单的答案 – 使用ToObservable 。 这就是它的用途。

“回答实际问题”答案 – 你可以避免通过Observable.Create使用Subjects

 void Main() { var src = Enumerable.Range(0, 10); var observable = Observable.Create(obs => { foreach(var item in src) { obs.OnNext(item); } return Disposable.Create(()=>{}); }); using(observable.Subscribe(Console.WriteLine)) { Console.ReadLine(); } } 

输出:

 0 1 2 3 4 5 6 7 8 9 

如果有一个IEnumerable未知类型,有两种方法可以“将其转换为IObservable”:

  • 将对象中的所有数据复制到实现IObservable的新集合中。 如果这样做,则仅报告对新集合所做的更改。 对原件所做的更改不会。

  • 创建一个新对象,定期拍摄IEnumerable内容的快照; 获取每个快照后,报告必须对上一个快照进行的所有更改,以使其与新快照匹配。 使用这种方法,最终会观察到对原始对象所做的更改,但很难提供及时的更新通知,而不会在没有任何变化时浪费大量时间重复读取集合。

有时需要将IObservable绑定到原始IEnumerable对象,而不是预先填充数据副本的新对象; 在这种情况下,第二种方法可能是必要的。 但是,通常不可能使轮询速率足够快以提供及时更新,除非原始集合支持任意IEnumerable中不可用的function,否则不会导致不可接受的系统加载。 此外,如果没有对IEnumerable的类型强加要求,则可能必须对可能更新的线程上下文施加限制。