IObservable<IEnumerable<T>> 真的应该是 IObservable<T> 吗?

Should an IObservable<IEnumerable<T>> really be an IObservable<T>?

考虑一种方法 DoSomething() returns:

  1. IObservable<IEnumerable<T>> DoSomething()
  2. IObservable<T> DoSomething()

同时考虑:

考虑这个Observable.Buffer extension method的签名:

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

显然,如果将结果展平为 IObservable<TSource>

就不会很有用了

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

返回 IObservable<IEnumerable<T>> 没有错,如果这就是您的方法的意思。 Buffer 是一个有意义的例子——任何带有批处理的东西都是有意义的。如果您有接受批量订单请求的服务,那么 IObservable<IEnumerable<Order>> 可能有效。你可以把它弄平,这也可能有效。

这取决于 batch/buffer 本身的概念是否是您的方法应该做的事情的组成部分。如果您的方法恰好使用缓冲区来实现其目的,但该方法本质上不是批处理操作,那么展平 Observable 可能会更直观。

IObservable<IEnumerable<T>> 确实与 IObservable<T>.

在语义上有所不同

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

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

前者可以用来表示时间点之间的 activity 并且返回一个空的可枚举将肯定地表示自上一个值以来的 nil activity 。后者不能明确地这样做。

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