我需要将对象流转换为一批对象流,并使用反应性扩展将它们按属性值分组:
class Record
{
public string Group;
public int Value;
}
IObservable<List<Record>> Process(IObservable<Record> source, TimeSpan timeout)
{
// ...
}
批处理完成并在以下两种情况之一发生时发送到输出流:
Group
值不同于先前的值N
秒内,源流中没有新对象例如,如果a1
的意思是new Record { Group = "a", Value = 1}
:
input: -a1-a2-a3-b1-b2-
output: -[a1, a2, a3]-[b1, b2]-
input: -a1-a2----------a3-
output: -[a1, a2]-------[a3]-
尝试GroupByUntil
,Debounce
,Buffer
和Timer
的各种组合均无济于事。怎么做?
答案 0 :(得分:2)
诀窍是将GroupByUntil
与Throttle
一起使用:
IObservable<List<Record>> Process(IObservable<Record> source, TimeSpan timeout)
{
return source.GroupByUntil(x => x.Group, g => g.Throttle(timeout))
.SelectMany(x => x.ToList());
}