簡體   English   中英

如何將IEnumerable轉換為IObservable?

[英]how to convert IEnumerable to 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的類型強加要求,則可能必須對可能更新的線程上下文施加限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM