2011-09-01 72 views
0

我連接到一個對象,異步加載對象集合到IEnumerable中。在我連接的時候,IEnumerable可能已經有一些項目已經在它的集合中,並且可能會在應用程序的生命週期中添加項目,我需要在它們發生時通知它們。作爲一個例子,它可能是一個包含銀行交易清單的銀行賬戶。使用無效擴展來監視IEnumerable

挑戰是這樣的。我想將IEnumerable中初始值的處理與任何新增加的內容結合起來。他們目前是兩個過程。我想完全消除NotifyCollectionChanged的使用。

我可以修改擁有IEnumerable的後端。如果不存在這種問題的解決方案,則不需要保留爲IEnumerable。

+0

您可以使用RX訂閱'NotifyColl ectionChanged'如果你的集合支持它。你不能訂閱'IEnumerable',因爲它不是一個事件。問題不是那麼清楚,有多少藏品?你是從一個複製到另一個? – TheCodeKing

+0

我們實際上試圖消除源集合中INotifyCollectionChanged的使用。在這種情況下,只有兩個集合,即源和目標。但是這個例子是從真正發生的事情中簡化的。它們是包含不同類型對象的集合,還有更多。 – Random

+0

我猜這很難知道你在做什麼,然後RX很適合基於事件的交互。 – TheCodeKing

回答

2

我會建議該對象不應該公開IEnumerable,因爲這是「冷觀察值」,在你的情況下,你需要一些東西可以在將來獲得額外的項目。

建模的最佳方法是使用ReplaySubject<T>而不是IEnumerable。下面是展示類似你的情況的例子:

//Function to generate the subject with future values 
public static ReplaySubject<int> GetSubject() 
{ 
    var r = new ReplaySubject<int>(); 
    r.OnNext(1); r.OnNext(2); r.OnNext(3); 
    //Task to generate future values 
    Task.Factory.StartNew(() => 
    { 
     while (true) 
     { 
      Thread.Sleep(3000); 
      r.OnNext(DateTime.Now.Second); 
     } 
    }); 
    return r; 
} 

消費代碼:

var sub = GetSubject(); 
sub.Subscribe(Console.WriteLine); 

每次有人贊成sub他們將獲得已發佈的主題至今的所有值以及此主題將來產生的新值

+0

這是一些令人討厭的循環,而不是Rx的重點。 – TheCodeKing

+0

我已經在我的回答中提到這是使用ReplySubject的一個示例。循環只是爲了保持主題的價值。 – Ankur

+0

是的,我瞭解它,我只是不熱衷於Rx問題的基於輪詢的解決方案。 – TheCodeKing

0

您可以使用延遲/重播操作員