我有一个按排序顺序排列的事件流。每个事件都是具有键属性(其 ID)的组的一部分。对于非 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
元素。
我想过缓冲什么的,但仍然让我的头脑被动。有什么想法吗?
source.Buffer(2, 1)
.Where(i => i.Count == 2 ? (i[0].ID != i[1].ID) : true)
.Select(i => i[0])
保持Observable
的 2 个最新元素的运行缓冲区。 如果 ID 更改或缓冲区仅包含一个元素(最后一个元素),则发出缓冲区的第一项。