4

次のコードが遅延評価されているかどうか、またはの可能性のある例外を処理する方法でクラッシュするかどうかを知りたいですReadAllLines()。そのWhere句が遅延評価されることは確かですが、それをいつ使用するかはわかりませんReadAllLines()。方法と理由の可能な説明をいただければ幸いです。

File.ReadAllLines 例外

var fileLines = File.ReadAllLines(filePath).Where(line =>
{
    line = line.Trim();
    return line.Contains("hello");
});

string search;
try
{
    search = fileLines.Single();
}
catch (Exception exception)
{
    ...log the exception...
}

前もって感謝します

4

1 に答える 1

10

File.ReadAllLines遅延ロードではなく、すべてをメモリにロードします。

string[]  allLines = File.ReadAllLines(filePath);

LINQ の遅延実行を使用する場合は、File.ReadLines代わりに使用できます。

var fileLines = File.ReadLines(filePath)
    .Where(line =>
    {
        line = line.Trim();
        return line.Contains("hello");
    });

これも文書化されています:

ReadLinesReadAllLinesメソッドは次 のように異なります。を使用するReadLinesと、コレクション全体が返される前に文字列のコレクションの列挙を開始できます。を使用する場合ReadAllLines、配列にアクセスする前に、文字列の配列全体が返されるまで待つ必要があります。したがって、非常に大きなファイルを操作している場合は、ReadLines の方が効率的です。

ReadLinesただし、重複して使用することはできないので注意が必要です。もう一度「実行」しようとするとObjectDisposedException、基になるストリームが既に破棄されているため、 が返されます。更新 このバグは修正されたようです。

これにより、たとえば次のような例外が発生します。

var lines = File.ReadLines(path);
string header = lines.First();
string secondLine = lines.Skip(1).First();

ストリームがまだ開いているため、同じファイルへの書き込みにも使用できません。

File.WriteAllLines(path, File.ReadLines(path)); // exception:  being used by another process.

これらの場合File.ReadAllLinesは、より適切です。

于 2014-09-08T14:42:49.477 に答える