IEnumerable作为流发出吗?

时间:2018-08-02 18:20:26

标签: c# stream ienumerable

是否有一种方法来获取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并发送它。我可以假脱机到磁盘并从磁盘读取数据,但是我不愿意选择是否这样做,因为这似乎是一个额外的步骤。

这可能吗?如果有可能,是否可行?

1 个答案:

答案 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 IEnumerableIEnumerable<T>-> Stream转换的一种可能的实现方式。