产生多个IEnumebles

gjv*_*amp 2 c# stream

我有一段代码可以对资产进行计算.有数百万,所以我想在流中计算所有内容.我目前的'管道'看起来像这样:

我有一个作为Datareader执行的查询.

然后我的Asset类有一个接受IDataReader的构造函数;

Public Asset(IdataReader rdr){
  // logic that initiates fields
}
Run Code Online (Sandbox Code Playgroud)

以及将IDataReader转换为IEnumerable <Asset>的方法

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);

}
Run Code Online (Sandbox Code Playgroud)

然后将其传递给执行实际计算的函数,然后将其投影到IEnumerable <Asnwer>中

然后得到一个包装器将Answers公开为IDataReader,然后将其传递给OracleBulkCopy并将流写入数据库.

到目前为止它的工作就像一个魅力.由于设置,我可以将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;
   }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢,

格特 - 扬

Str*_*ior 5

您所描述的内容听起来有点像Reactive框架通过IObservable接口提供的内容,但我不确定它是否允许多个订阅者使用单个订阅流.

更新

如果您查看文档IObservable,它有一个非常好的示例,说明如何执行您正在执行的操作,具有单个对象的多个订阅者.

  • 是的,您可以将多个观察者订阅到单个可观察对象. (2认同)