テキストファイルの末尾から指定した行数のテキストを効率的に取り出したいです。
Linux の tail コマンドのようなものです。(こちらの質問 のC#版です)

簡単な実装方法として、

var path = "test.txt";
var n = 10;

var lines = File.ReadAllLines(path);

foreach (var line in lines.Skip(lines.Length - n).Take(n))
{
    System.Console.WriteLine(line);
}

このようにファイルを先頭から全て読み込んで末尾のn行を取り出すということは出来るのですが、この方法だとファイルサイズが大きい時に処理時間が長くなってしまいます。ディスクI/Oやメモリ消費という面からも好ましくないと思います。

ファイルをランダムアクセスして末尾から1行ずつ取り出すにはどのような方法があるでしょうか?

対象のテキストファイルは以下の想定です。

  • 文字コードは UTF-8
  • 改行はCRLF、LFが混在
  • 1行の文字数に上限なし