如何按顺序仅发出最后一个匹配元素?

时间:2017-04-22 19:37:06

标签: system.reactive reactive-programming

我有一系列按排序顺序排列的事件。每个事件都是具有密钥属性的组的一部分 - 其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的元素后,就会发出第一个元素。

我想过缓冲或其他什么,但仍然让我的头脑反复。有什么想法吗?

1 个答案:

答案 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更改或缓冲区仅包含一个元素(最后一个元素),则发出缓冲区的第一项。