這與我的另一個問題here有關。 James World提出的解決方案如下:Rx如何按鍵複合一個複合對象,然後在沒有「停止」流的情況下執行SelectMany?
// idStream is an IObservable<int> of the input stream of IDs
// alarmInterval is a Func<int, TimeSpan> that gets the interval given the ID
var idAlarmStream = idStream
.GroupByUntil(key => key, grp => grp.Throttle(alarmInterval(grp.Key)))
.SelectMany(grp => grp.IgnoreElements().Concat(Observable.Return(grp.Key)));
<編輯2:
問:我如何立即啓動定時器,而無需等待第一個事件的時候?這是我的問題的根本問題,我猜。爲此,我計劃發送帶有我知道應該在那裏的ID的虛擬對象。但正如我在下面寫的,我結束了一些其他問題。不過,我認爲解決這個問題也很有趣。
然後轉發其他有趣的部分!現在,如果我想組像下面和組通過如下關鍵一個複雜的對象(不會編譯)
var idAlarmStream = idStream
.Select(i => new { Id = i, IsTest = true })
.GroupByUntil(key => key.Id, grp => grp.Throttle(alarmInterval(grp.Key)))
.SelectMany(grp => grp.IgnoreElements().Concat(Observable.Return(grp.Key)));
然後我惹上麻煩。我無法修改關於SelectMany
,Concat
和Observable.Return
的部分,以便查詢可以像以前一樣工作。舉例來說,如果我做查詢作爲
var idAlarmStream = idStream
.Select(i => new { Id = i, IsTest = true })
.GroupByUntil(key => key.Id, grp => grp.Throttle(alarmInterval(grp.Key)))
.SelectMany(grp => grp.IgnoreElements().Concat(Observable.Return(grp.Key.First())))
.Subscribe(i => Console.WriteLine(i.Id + "-" + i.IsTest);
然後需要兩個事件都可以在Subscribe
觀察的輸出之前。我收集的是First
的調用效果。此外,我還希望在調用alarmInterval
時也使用複雜的對象屬性。
有人可以提供解釋發生了什麼,甚至可能是解決方案嗎?使用未經修改的解決方案的問題在於,分組不會僅將Ids看作關鍵值,而且還會看到IsTest字段。
<編輯:作爲一個說明,這個問題大概可以firsly通過創建一個明確的類或結構解決,那麼IEquatable
其次實現了自定義,然後用詹姆斯的代碼,那麼該分組將被髮生身份證。雖然感覺像黑客。
這就是我想要的。我目前無法測試(一個人必須進食和睡眠),但看起來很合理,無論如何你看起來像是在右側的球場。我能想到的另一個變體是,如果我想爲每個ID有多個缺席警報期以及如何從那裏繼續進行操作。無論是通過從一個合成身份證創建多個事件,還是從那裏進行思考,嵌套組。在完成這個主題之前,我會更好地發佈另一個問題。 :) – Veksi