应该是IObservable <ienumerable <t>&gt;真的是一个IObservable <t>?</t> </ienumerable <t>

时间:2015-04-20 15:23:58

标签: system.reactive reactive-programming

考虑一个返回的方法DoSomething()

  1. IObservable<IEnumerable<T>> DoSomething()
  2. IObservable<T> DoSomething()
  3. 考虑到两者:

    • 方法FlatMap IEnumerable应该是一个IObservable吗?
    • 是否应由消费者随意做?
    • 是单向还是其他正确
    • 这两种方式都有关系,你的消费者应该按照自己的意愿去做,回报的意图是一样的吗?

3 个答案:

答案 0 :(得分:2)

考虑此Observable.Buffer extension method的签名:

IObservable<IList<TSource>> Buffer<TSource>(IObservable<TSource> source, int count)

显然,如果结果被展平为IObservable<TSource>,它将不会非常有用。

正如你自己所说,IObservable<T>IObservable<IEnumerable<T>>在概念上是不同的。

答案 1 :(得分:1)

IObservable<IEnumerable<T>>在语义上与IObservable<T>不同。

IObservable<IEnumerable<T>>表示报告零个或多个值的零个或多个时刻。

IObservable<T>表示报告单个值的零个或多个时刻。

然后可以使用前者来表示时间点之间的活动,并且返回空的可枚举将积极地表示自上一个值以来的nil活动。后者无法明确这样做。

因此,这两种形式可用于表示两种不同的现实方式或报告值。

答案 2 :(得分:0)

如果您的方法意味着什么,那么返回IObservable<IEnumerable<T>>并没有错。缓冲区是一个有意义的例子 - 任何有批处理的东西都有意义。如果您有接受批量订单请求的服务,则IObservable<IEnumerable<Order>>可能有效。你可以压扁它,这也可能是有效的。

这取决于批处理/缓冲区本身的概念是否与您的方法应该执行的操作不可分割。如果您的方法碰巧使用缓冲区来实现其目标,但该方法本质上不是批处理操作,那么展平Observable可能会更直观。