按属性和超时将IObservable分组

时间:2019-02-22 18:01:14

标签: c# .net observable system.reactive

我需要将对象流转换为一批对象流,并使用反应性扩展将它们按属性值分组:

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]-

尝试GroupByUntilDebounceBufferTimer的各种组合均无济于事。怎么做?

1 个答案:

答案 0 :(得分:2)

诀窍是将GroupByUntilThrottle一起使用:

IObservable<List<Record>> Process(IObservable<Record> source, TimeSpan timeout)
{
    return source.GroupByUntil(x => x.Group, g => g.Throttle(timeout))
                 .SelectMany(x => x.ToList());
}