2017-04-22 40 views
1

我有一個排序順序的事件流。每個事件都是具有關鍵屬性(即其ID)的組的一部分。這些事件對於非ID屬性具有不同的值。我希望在身份證更改之前忽略除最終事件之外的所有事宜。例如如何依次發出最後一個匹配元素?

{ID:1, Prop: "V1"}, {ID:1, Prop:"V2"}, {ID:1, Prop:"V3"}, {ID:2, Prop:"V1"}, {ID:2, Prop:"V2"}, {ID:2, Prop:"V3"}, {ID:2, Prop:"V25"}, {ID:3, Prop:"V1"}, {ID:3, Prop:"V8"} 

我想只發出:

{ID:1, Prop:"V3"},{ID:2, Prop:"V25"},{ID:3, Prop:"V8"} 

我用了GroupBy ID,然後TakeLast(1)TakeLast,據我瞭解,會等到流完成,似乎可能多花更多的時間。我知道當我在流中看到不同的ID時,我已經看到了這個ID序列的最後一個 - 所以我希望在我看到關鍵屬性發生變化時立即發出該值。我想有點像distinctUntilChange,但給我最後的價值。

只要我在流中看到第一個包含ID:2的元素,我預計會發出第一個元素。

我想過緩衝或什麼東西,但仍然得到我的頭反應。有任何想法嗎?

回答

2
source.Buffer(2, 1) 
     .Where(i => i.Count == 2 ? (i[0].ID != i[1].ID) : true) 
     .Select(i => i[0]) 

保持Observable的2個最新元素的運行緩衝區。 如果ID更改或緩衝區只包含一個元素(最後一個元素),則發出緩衝區的第一項。

+1

我認爲它涉及緩衝。也許我還沒有完成對小溪的掌握! – GraemeMiller

相關問題