[英]How to convert an IEnumerable<Task<T>> to IObservable<T>
[英]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.