这样做有什么问题吗?
int i = new StreamReader("file.txt").ReadToEnd().Split(new char[] {'\n'}).Length
Juliet.. 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;
你实际上把这个文件保存在内存中两次:一次读取所有行,一次将它拆分成一个数组.垃圾收集器讨厌这个.
如果你喜欢一个衬里,你可以写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; } }
上面的代码在任何给定时间(最多)保存在内存中的一行文本.只要线条相对较短,它就会高效.
您发布的方法并不是特别好.让我们分开:
// 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;
你实际上把这个文件保存在内存中两次:一次读取所有行,一次将它拆分成一个数组.垃圾收集器讨厌这个.
如果你喜欢一个衬里,你可以写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; } }
上面的代码在任何给定时间(最多)保存在内存中的一行文本.只要线条相对较短,它就会高效.
那么,这样做的问题是在大文件上执行此操作时会分配大量内存.
我宁愿逐行读取文件并手动递增计数器.这可能不是单行,但它的内存效率更高.
或者,您可以以偶数大小的块加载数据并计算这些中的换行符.这可能是最快的方式.