如何将IEnumerable转换为IObservable?

10

我想将一个IEnumerable集合转换为IObservable集合,但不使用Rx ToObservable()和ToEnumerable()方法。


8
为什么你不想使用 ToObservable() 呢? - Daniel Hilgarth
@DanielHilgarth 我承认,我也很好奇 - 这就是 ToObservable() 的意义所在。 - JerKimball
2个回答

10

简单回答 - 使用 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 有什么不同吗? - interlude
1
@interlude 其实不是,我只是使用了重载,以便在需要时添加清理逻辑。 - JerKimball

1
如果有一个未知类型的IEnumerable,有两种方法可以将其“转换为IObservable”:
  • 将对象中的所有数据复制到实现了IObservable的新集合中。如果这样做,只会报告对新集合所做的更改。对原始集合进行的更改不会被报告。

  • 创建一个新对象,定期快照IEnumerable的内容;在每个快照之后,报告所有必须进行的更改,以使前一个快照与新快照匹配。使用此方法,最终将观察到对原始对象所做的更改,但是如果在没有更改时反复读取集合,就很难提供及时的更新通知而不浪费大量时间。

有时候需要将 IObservable 绑定到原始的 IEnumerable 对象上,而不是绑定到一个预先填充了数据副本的新对象上;在这种情况下,可能需要采用第二种方法。然而,通常情况下,如果原始集合不支持任意 IEnumerable 中不可用的特性,则无法使轮询速率足够快以提供及时更新而不会引起不可接受的系统负载。此外,如果不对 IEnumerable 的类型施加要求,则可能需要对可以更新它的线程上下文施加限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接