如何在Reactive Extensions中将项目缓冲到组中?

时间:2011-08-05 23:14:47

标签: c# linq system.reactive observer-pattern observable

我有一个IObservable;其中属性更改具有实体ID和PropertyName。我想用它来更新数据库,但如果多个属性几乎同时发生变化,我只想对同一个实体的所有属性进行一次更新。

如果这是一个静态IEnumerable并且我使用的是LINQ,我可以简单地使用:

MyList.GroupBy(C=>C.EntityID);

但是,列表永远不会终止(从不调用IObserver.OnComplete)。我希望能够做的是等待一段时间,比如说1秒钟,将所有呼叫分组一段时间。

理想情况下,我会为每个EntityID设置单独的计数器,只要找到该EntityID的新属性更改,它们就会重置。

我不能使用像Throttle这样的东西,因为我想处理所有的属性更改,我只想一起处理它们。

2 个答案:

答案 0 :(得分:7)

你走了:

MyObservable
    .Buffer(TimeSpan.FromSeconds(1.0))
    .Select(MyList =>
        MyList.GroupBy(C=>C.EntityID));

答案 1 :(得分:2)

Buffer方法似乎可以做你想要的。给它TimeSpan,它会将所有消息都折叠成一个列表。还有Window方法做了类似的事情,但我不完全确定它的语义可能是什么。

相关问题