【问题标题】:How do I emit only last matching element in sequence?如何仅按顺序发出最后一个匹配元素?
【发布时间】:2017-04-23 20:05:32
【问题描述】:

我有一个按排序顺序排列的事件流。每个事件都是具有关键属性的组的一部分 - 它的 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 的第一个元素时立即发出第一个元素。

我考虑过缓冲之类的东西,但我仍然在反应。有什么想法吗?

【问题讨论】:

    标签: system.reactive reactive-programming


    【解决方案1】:
    source.Buffer(2, 1)
          .Where(i => i.Count == 2 ? (i[0].ID != i[1].ID) : true)
          .Select(i => i[0])
    

    保留Observable 的 2 个最新元素的运行缓冲区。 如果 ID 发生变化或缓冲区仅包含一个元素(最后一个元素),则发出缓冲区的第一项。

    【讨论】:

    • 我认为它涉及缓冲。也许我还会掌握流!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多