如何将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
的类型强加要求,则可能必须对可能更新的线程上下文施加限制。