如何将 IEnumerable 转换为 IObservable

本文关键字:IObservable 转换 IEnumerable | 更新日期: 2023-09-27 18:17:08

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

如何将 IEnumerable 转换为 IObservable

简单的答案 - 使用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

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

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

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

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