如何将IEnumerable转换为IObservable?

时间:2013-06-06 12:22:43

标签: c# ienumerable system.reactive observable

我正在寻找将IEnumerable集合转换为IObservable集合 不使用Rx ToObservable()和ToEnumerable()方法。

2 个答案:

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