プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2020/07/17

[C#] Stream に対して ReadAllLines を行いたい

event_note2020/07/17 0:12

File クラスには ReadAllLines というメソッドがありますが、Stream にはないので、同等の機能を実装してみます。

環境

  • Visual Studio 2017
  • .NET Core 2.2
  • C# 7.1

サンプルコード

IEnumerable<string> ReadAllLines(Stream stream)
{
    var lines = new List<string>();

    using (var sr = new StreamReader(stream))
    {
        while (sr.Peek() >= 0)
            lines.Add(sr.ReadLine());
    }
    
    return lines;
}

反復子を使うともうちょっとシンプルになります。

IEnumerable<string> ReadAllLines(Stream stream)
{
    using (var sr = new StreamReader(stream))
    {
        while (sr.Peek() >= 0)
            yield return sr.ReadLine());
    }
}

非同期版です。

async Task<IEnumerable<string>> ReadAllLinesAsync(Stream stream)
{
    var lines = new List<string>();

    using (var sr = new StreamReader(stream))
    {
        while (sr.Peek() >= 0)
            lines.Add(await sr.ReadLineAsync());
    }

    return lines;
}

C# 8.0 以降であれば async/awaityield が共存できるそうなので、もっとシンプルになります。

あとは、これらは拡張メソッドにしておいたほうが使い勝手が良いかもしれません。