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");
    });

这也记录在案

ReadLines和方法的ReadAllLines区别如下: 使用时 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 回答