我有一个IObservable<T>
来自解析CSV,为每一行吐出一个已解析的结果。
现在有一个问题是源数据中的损坏,直到我已经到达文件末尾才能检测到:使用当前的Reactive设置,这意味着我已经发出不好的结果。
在解决源数据问题之前,有没有办法可以&#34;缓冲&#34; (保留)整个IObservable
结果流,以便在成功完成之前不会发出任何结果?没有方法签名应该更改(源应该仍然返回IObservable<T>
)。
答案 0 :(得分:2)
这很容易,只需这样做:
var query = source.ToArray();
IDisposable subscription =
source.Subscribe(allRows =>
{
/* do something with `allRows` */
});
.ToArray()
运算符将IObservable<T>
转换为返回零或更多值的IObservable<T[]>
,返回一个包含零个或多个元素的T
数组。
您必须确保源观察结束以OnCompleted
结束才能生成数组。
您还可以使用.ToList()
返回IList<T>
而不是T[]
。
如果您想返回IObservable<T>
而不是IObservable<T[]>
,只需在.SelectMany(t => t)
之后添加.ToArray()
即可。请记住,这意味着一旦源可观察完成,所有值将立即出现。
答案 1 :(得分:-2)
我确定有更好的方法,但这应该有效:
// csvObservable is your existing observable
var waitTillEndObservable = csvObservable.ToList().Wait().ToObservable();
这将转换为一个列表,等待它完成,然后转换回一个observable,以便它可以与现有的csvObservable互换使用。