我有一系列按排序顺序排列的事件。每个事件都是具有密钥属性的组的一部分 - 其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序列的最后一个 - 所以我想在看到key属性发生变化时立即发出值。我想有点像distinctUntilChange
,但给了我最后的价值。
我希望在流中看到第一个带有ID:2
的元素后,就会发出第一个元素。
我想过缓冲或其他什么,但仍然让我的头脑反复。有什么想法吗?
答案 0 :(得分:2)
source.Buffer(2, 1)
.Where(i => i.Count == 2 ? (i[0].ID != i[1].ID) : true)
.Select(i => i[0])
保留Observable
的2个最新元素的运行缓冲区。
如果ID更改或缓冲区仅包含一个元素(最后一个元素),则发出缓冲区的第一项。