是否有一种方法来获取IEnumerable<T>
并将其作为可读流发出,就像这样?
private void DoTheThing(IEnumerable<Foo> foos)
{
using (var myStream = foos.EmitAsStream(f =>
{
var line = JsonConvert.SerializeObject(f);
return line;
}))
using(var streamReader = new StreamReader(myStream))
{
while (!streamReader.EndOfStream)
{
var line = streamReader.ReadLine();
Console.WriteLine(line);
}
}
}
显然,这存在一些问题,例如,这似乎暗示了未指定StreamWriter
的问题,但是这种想法是,流读取器只会通过IEnumerable
产生枚举,引擎盖,应用变换委托并提取结果,而无需在内存中创建任何新的潜在大对象。
我的内存中有一些非常大的可枚举对象,我需要将它们推到接受流的外部位置(例如Amazon S3)。我真的负担不起用集合构建一个MemoryStream并发送它。我可以假脱机到磁盘并从磁盘读取数据,但是我不愿意选择是否这样做,因为这似乎是一个额外的步骤。
这可能吗?如果有可能,是否可行?
答案 0 :(得分:2)
如果我正确理解您的问题,则可以使用TakeWhile来实现。
类似:
while(..end ..)
{
var enumeration = foos.TakeWhile(..line bounds..);
var stream = StreamFromEnum(enumeration ); //custom implementation
// stream --> S3
}
我假设您对“行”有一些自定义定义,这可能是流中数据的跨步/分段。
A lazily-evaluated stream wrapper for IEnumerable是IEnumerable<T>
-> Stream
转换的一种可能的实现方式。