8

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

4

2 回答 2

8

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

“回答实际问题”答案 - 您可以避免使用Subjectsvia 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
于 2013-06-06T20:30:17.287 回答
1

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

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

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

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

于 2013-06-07T20:48:50.013 回答