代码之家  ›  专栏  ›  技术社区  ›  Jeremy Holovacs

以流的形式发射的IEnumerable?

  •  2
  • Jeremy Holovacs  · 技术社区  · 6 年前

    有没有办法 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)。我真的负担不起用集合构建一个内存流并将其发送出去;我可以在磁盘上执行spool和从磁盘读取,但如果我有选择的话,我宁愿不这样做,因为这似乎是一个额外的步骤。

    这可能吗?如果可能的话,是否可行?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tigran    6 年前

    你可以,通过使用 TakeWhile ,如果我正确理解你的问题。

    类似于:

    while(..end ..) 
    {
       var enumeration = foos.TakeWhile(..line bounds..);
       var stream = StreamFromEnum(enumeration ); //custom implementation
       // stream --> S3
    }
    

    我假设您对“line”有一些自定义定义,可能是流中的某种跨距/片段数据。

    A lazily-evaluated stream wrapper for IEnumerable 是一个可能的实现 IEnumerable<T> -> Stream 转换。