【发布时间】:2011-08-05 14:10:24
【问题描述】:
我有一段代码可以对资产进行计算。有数百万个,所以我想计算流中的所有内容。我当前的“管道”如下所示:
我有一个作为 Datareader 执行的查询。
然后我的 Asset 类有一个接受 IDataReader 的构造函数;
Public Asset(IdataReader rdr){
// logic that initiates fields
}
以及将 IDataReader 转换为 IEnumerable
public static IEnumerable<Asset> ToAssets(IDataReader rdr) {
// make sure the reader is in the right formt
CheckReaderFormat(rdr);
// project reader into IEnumeable<Asset>
while (rdr.Read()) yield return new Asset(rdr);
}
然后将其传递给执行实际计算的函数,然后将其投影到 IEnumerable
然后得到一个包装器,将 Answers 公开为 IDataReader,然后将其传递给 OracleBulkCopy 并将流写入 DB。
到目前为止,它就像一个魅力。由于设置,我可以将 DataReader 交换为从文件读取的 IEnumerable,或者将结果写入文件等。这一切都取决于我如何将类/函数串在一起。
现在:我可以计算几件事,例如,除了正常的答案之外,我还可以有一个 DebugAnswer 类,它还输出一些中间数字以进行调试。所以我想做的是将 IEnumerable 投影到几个输出流中,这样我就可以在这些输出流上放置“侦听器”。这样我就不必多次检查数据。我怎样才能做到这一点?有点像有几个事件,然后只有在附加了一个监听器时才触发某些代码。
有时我也会写入数据库,但也会写入 zip 文件,只是为了备份结果。那么我想在 IEnumerable 上有 2 个“侦听器”。一种是作为 IDataReader 进行投影,另一种是直接写入文件。
如何输出多个输出流以及如何将多个侦听器放在一个输出流上?是什么让我组成这样的数据流?
编辑
所以我想做一些伪代码:
foreach(Asset in Assets){
if(DebugListener != null){
// compute
DebugAnswer da = new DebugAnswer {result = 100};
yield da to DebugListener; // so instead of yield return yield to that stream
}
if(AnswerListener != null){
// compute basic stuff
Answer a = new Answer { bla = 200 };
yield a to AnswerListener;
}
}
提前致谢,
格特-简
【问题讨论】:
-
听起来你想看看Rx。
-
子类资产? Rx 看起来像你所追求的(以上+1)