2011-08-05 42 views
3

我有一個IObservable;其中屬性更改具有實體ID和PropertyName。我想用它來更新數據庫,但是如果多個屬性幾乎同時改變,我只想對同一個實體的所有屬性進行一次更新。如何將項目緩存到無功擴展組中?

如果這是一個靜態的IEnumerable和我使用LINQ我可以簡單地使用:

MyList.GroupBy(C=>C.EntityID); 

然而,列表永遠不會終止(從來不打電話IObserver.OnComplete)。我希望能夠做的是等待一段時間,比如說1秒,將所有的呼叫合理分組。

理想情況下,我會爲每個EntityID分開計數器,並且只要找到該EntityID的新屬性更改,它們就會重置。

我不能使用像Throttle這樣的東西,因爲我想處理所有的屬性更改,我只想一起處理它們。

+0

標題和你的問題的文字似乎是完全無關的。你能解決這個問題嗎? – svick

+0

已修復,雖然我也很想知道GroupByUntil的工作原理以及工作原理,但看起來它可能做我想做的事,但當我嘗試使用不同的輸入進行測試時,似乎沒有做任何事情。 – ForbesLindesay

回答

7

在這裏你去:

MyObservable 
    .Buffer(TimeSpan.FromSeconds(1.0)) 
    .Select(MyList => 
     MyList.GroupBy(C=>C.EntityID)); 
2

Buffer方法似乎做你想做的。給它TimeSpan,它會將所有消息合併到一個列表中。也有類似的Window方法,但我不完全確定它的語義可能是什麼。

+0

在這種情況下,Window只會比Buffer更復雜,因爲您只需要在時間段內發生更改的列表 –

+0

感謝,鏈接爲+1 – ForbesLindesay

相關問題