【问题标题】:how to convert IEnumerable to IObservable?如何将 IEnumerable 转换为 IObservable?
【发布时间】:2013-06-02 10:55:21
【问题描述】:

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

【问题讨论】:

  • 你为什么不想使用ToObservable()
  • @DanielHilgarth 我承认,我也很好奇——这就是ToObservable()的重点

标签: c# ienumerable system.reactive observable


【解决方案1】:

简单的答案 - 使用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(()=&gt;{});Disposable.Empty 不同吗?
  • @interlude 不是真的,我只是使用了重载,因此可以在需要时添加清理逻辑。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多