我想将一个IEnumerable集合转换为IObservable集合,但不使用Rx ToObservable()和ToEnumerable()方法。
我想将一个IEnumerable集合转换为IObservable集合,但不使用Rx ToObservable()和ToEnumerable()方法。
简单回答 - 使用 ToObservable
。这就是它的用途。
“回答实际问题”的答案 - 您可以通过使用 Observable.Create
避免使用 Subjects
:
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
Disposable.Create(()=>{});
和 Disposable.Empty
有什么不同吗? - interludeIEnumerable
,有两种方法可以将其“转换为IObservable”:
将对象中的所有数据复制到实现了IObservable
的新集合中。如果这样做,只会报告对新集合所做的更改。对原始集合进行的更改不会被报告。
创建一个新对象,定期快照IEnumerable
的内容;在每个快照之后,报告所有必须进行的更改,以使前一个快照与新快照匹配。使用此方法,最终将观察到对原始对象所做的更改,但是如果在没有更改时反复读取集合,就很难提供及时的更新通知而不浪费大量时间。
IObservable
绑定到原始的 IEnumerable
对象上,而不是绑定到一个预先填充了数据副本的新对象上;在这种情况下,可能需要采用第二种方法。然而,通常情况下,如果原始集合不支持任意 IEnumerable
中不可用的特性,则无法使轮询速率足够快以提供及时更新而不会引起不可接受的系统负载。此外,如果不对 IEnumerable
的类型施加要求,则可能需要对可以更新它的线程上下文施加限制。
ToObservable()
呢? - Daniel HilgarthToObservable()
的意义所在。 - JerKimball