2013-10-29 120 views
1

我需要阅读 - 在.NET 4.5应用程序 中读取日志文件的第一行和最后一行,即。
日志文件在每一行都有时间戳,我想查找最年轻的(第一行)和最早的(最后一行)时间戳。这不是一项艰巨的任务,但我想知道是否有一个聪明的方法来做到这一点。读取文件中的第一行和最后一行

目前实施看起来是这样的(其实我需要的日志文件的第二行,因为第一行是空白,因此Skip()):

string firstLine = File.ReadLines(logFile).Skip(1); 
string lastLine = File.ReadLines(logFile).Last(); 

哪有这个非常简单的代码的任何改进?

+1

定义 “改进”。 Habib的答案对于小文件非常有用。尽管如此,对于非常大的文件来说,它会比较慢。但加速其中有些涉及。您最终以二进制读取文件的结尾,并向后回溯到最后一行的开头。如果您真的感兴趣,请参阅http://stackoverflow.com/a/452945/56778。 –

+0

跳过(1)表示它在第一个元素之后返回其余元素。我猜你认为First()? – Measuring

+0

@JimMischel执行时间的改进,内存紧随其后。由于对于最常见的情况来说,优化总是最好的,所以我可以说大多数文件的大小约为5MB或更少,在极端情况下大约为25MB(大约200k行)。我也可以有20-30个这样的文件进行解析。我往后看了一眼,并同意这看起来'很棘手',如果可能的话,会避免这种情况。目前的解决方案不是“缓慢”。 – valsidalv

回答

6

IEnumerable<string>中读一次,然后将其用于第二行和最后一行。

var lines = File.ReadLines(logFile); 
string firstLine = lines.Skip(1); 
string lastLine = lines.Last(); 

在你当前的代码你正在做阅读的两倍,如果您希望的文件进行修改之间的第一读取第二,那么你必须阅读文件的两倍。

+0

'lines'不是一个数组,它是一个'IEnumerable '。这比读入一个数组更好,它只是让你的文档有点偏离。 –

+0

@JoelRondeau,绝对正确,我把它混合ReadAllLines。 – Habib

+0

那么当我将两次调用'ReadLines'时发生了什么?整个文件会被读取两次吗? – valsidalv

相关问题