我有Observable<WebResponse>
(WebResponse
实施IDisposable
)
responseObservable
.Where(webResponse => webResponse.ContentType.StartsWith("text/html"))
.Select(webResponse => webResponse.ContentLength)
.Run()
(忽略查询的无意义!)
所以,我在没有调用WebResponse
的情况下放弃了Dispose
个实例。这看起来很糟糕。
更抽象地说:如果我有Observable<IDisposable>
,我该如何处理生成的项目?
答案 0 :(得分:2)
假设您有WebResponse CreateMyWebResponse()
方法,请使用Observable.Using
,如下所示:
var responseObservable = Observable.Using(() => CreateMyWebResponse(), Observable.Return);
答案 1 :(得分:1)
将Where
和Do
位更改为
.Do(webResponse => {
if (webResponse.ContentType.StartsWith("text/html"))
ProcessAndDispose(webResponse);
else
webResponse.Dispose(); })
也许?
修改
根据你的编辑,怎么样
.Select(webResponse => {
int r = -1;
if (webResponse.ContentType.StartsWith("text/html"))
r = webResponse.ContentLength;
webResponse.Dispose();
return r; })
.Where(i => i != -1)
现在?这将概括为类似
的内容FilterProjectDispose(e, pred, proj) {
e.Select(x => {
using(x) {
if (pred(x)) return Some(proj(x));
else return None; }})
.Where(x => x.IsSome)
.Select(x => x.Value)
}
假设Some
/ None
与F#一样(我显然开始忘记我的C#)。