我正在寻找将IEnumerable集合转换为IObservable集合 不使用Rx ToObservable()和ToEnumerable()方法。
答案 0 :(得分:8)
简单回答 - 使用ToObservable
。这就是它的用途。
“回答实际问题”答案 - 您可以通过Subjects
避免使用Observable.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();
}
}
输出:
0
1
2
3
4
5
6
7
8
9
答案 1 :(得分:1)
如果一个人有IEnumerable
未知类型,有两种方法可以“将其转换为IObservable”:
将对象中的所有数据复制到实现IObservable
的新集合中。如果这样做,则仅报告对新集合所做的更改。对原件所做的更改不会。
创建一个新对象,定期拍摄IEnumerable
内容的快照;获取每个快照后,报告必须对上一个快照进行的所有更改,以使其与新快照匹配。使用这种方法,最终会观察到对原始对象所做的更改,但很难提供及时的更新通知,而不会在没有任何更改的情况下浪费大量时间重复读取集合。
有些时候需要将IObservable
绑定到原始IEnumerable
对象,而不是预先填充数据副本的新对象;在这种情况下,第二种方法可能是必要的。但是,通常不可能使轮询速率足够快以提供及时更新,除非原始集合支持任意IEnumerable
中不可用的功能,否则不会导致不可接受的系统加载。此外,如果没有对IEnumerable
的类型强加要求,则可能必须对可能更新的线程上下文施加限制。