这是解决方案:
eventSource
.GroupBy(e => e.GroupingKey)
.SelectMany(group => group.Buffer(TimeSpan.FromSeconds(60), 100))
.Subscribe(list => SendToStorage(list));
以下是一些可以帮助您“减少”的一般规则:
1) 嵌套订阅通常固定Select
在嵌套订阅之前的所有内容,然后是 a Merge
,然后是嵌套订阅。所以应用它,你会得到这个:
eventSource
.GroupBy(e => e.GroupingKey)
.Select(group => new { group.Key, Events = group })
.Select(group => group.Events.Buffer(TimeSpan.FromSeconds(60), 100)) //outer subscription selector
.Merge()
.Subscribe(list => SendToStorage(list));
2)您显然可以组合两个连续的选择(并且由于您没有对匿名对象做任何事情,因此可以删除它):
eventSource
.GroupBy(e => e.GroupingKey)
.Select(group => group.Buffer(TimeSpan.FromSeconds(60), 100))
.Merge()
.Subscribe(list => SendToStorage(list));
3) 最后, aSelect
后跟 aMerge
可以简化为 a SelectMany
:
eventSource
.GroupBy(e => e.GroupingKey)
.SelectMany(group => group.Buffer(TimeSpan.FromSeconds(60), 100))
.Subscribe(list => SendToStorage(list));