我正在开发一种解决方案,其中例如对于用户而言以高速率发生变化。 我需要的是记录每个更改,延迟通知,然后返回不同的更改,例如已更改的用户的用户ID。 我使用rx:
提出了以下代码private Subject<int> userEventSubject= new Subject<int>();
userEventSubject
.Buffer(EVENT_BUFFER_DELAY)
.Where(buffer => buffer.Count > 0)
.Subscribe(OnEventBufferProcess);
这似乎工作正常,我得到了
添加的所有值userEventSubject.OnNext(userId);
我的问题是:我可以区分更改,例如,当具有相同用户ID值的多个OnNext时,我不希望生成的缓冲区包含重复项。当然我可以在Subscribe处理程序中使用不同的值,但我想知道这是否可以在rx级别上完成?我尝试了不同的方法,但仍然可以得到所有的值。
由于我只想跟踪延迟期间所做的更改,返回订阅处理程序并重新开始,是否需要清除userEventSubject?
答案 0 :(得分:3)
如果您使用Observable.Distinct
方法,则会检查不同的IList<int>
,这确实不是您想要的行为。
您似乎需要将distinct应用于缓冲区中的元素。
您可以使用Observable.Select
方法将其应用于每个缓冲区:
private Subject<int> userEventSubject= new Subject<int>();
userEventSubject
.Buffer(EVENT_BUFFER_DELAY)
.Where(buffer => buffer.Count > 0)
.Select(buffer => buffer.Distinct()) // distinct elements in each buffer
.Subscribe(OnEventBufferProcess);
请注意,无论何时使用Distinct()
方法,都需要警惕如何检查相等性,如果使用引用类型 - 您可能需要实现某种相等比较器。在这种情况下,这不是问题,因为您正在使用int
s。
答案 1 :(得分:0)
您可以使用DistinctUntilChanged扩展方法:
private Subject<int> userEventSubject= new Subject<int>();
userEventSubject
.DistinctUntilChanged()
.Buffer(EVENT_BUFFER_DELAY)
.Where(buffer => buffer.Count > 0)
.Subscribe(OnEventBufferProcess);