这样做有什么问题吗?
int i = new StreamReader("file.txt").ReadToEnd().Split(new char[] {'\n'}).Length
Run Code Online (Sandbox Code Playgroud)
Jul*_*iet 47
您发布的方法并不是特别好.让我们分开:
// new StreamReader("file.txt").ReadToEnd().Split(new char[] {'\n'}).Length
// becomes this:
var file = new StreamReader("file.txt").ReadToEnd(); // big string
var lines = file.Split(new char[] {'\n'}); // big array
var count = lines.Count;
Run Code Online (Sandbox Code Playgroud)
你实际上把这个文件保存在内存中两次:一次读取所有行,一次将它拆分成一个数组.垃圾收集器讨厌这个.
如果你喜欢一个衬里,你可以写System.IO.File.ReadAllLines(filePath).Length
,但仍然可以在一个数组中检索整个文件.如果你不打算坚持阵列就没有意义.
更快的解决方案是:
int TotalLines(string filePath)
{
using (StreamReader r = new StreamReader(filePath))
{
int i = 0;
while (r.ReadLine() != null) { i++; }
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在任何给定时间(最多)保存在内存中的一行文本.只要线条相对较短,它就会高效.
那么,这样做的问题是在大文件上执行此操作时会分配大量内存.
我宁愿逐行读取文件并手动递增计数器.这可能不是单行,但它的内存效率更高.
或者,您可以以偶数大小的块加载数据并计算这些中的换行符.这可能是最快的方式.
归档时间: |
|
查看次数: |
62178 次 |
最近记录: |