c#如何计算文本文件中的行数

c#如何计算文本文件中的行数,c#,C#,这样做有什么问题吗 int i = new StreamReader("file.txt").ReadToEnd().Split(new char[] {'\n'}).Length 这样做的问题是,在对大文件执行此操作时,会分配大量内存 我宁愿逐行读取文件并手动递增计数器。这可能不是一行程序,但它的内存效率要高得多 或者,您可以加载大小均匀的数据块,并计算这些数据块中的换行次数。这可能是最快的方法。当然-它将整个流读取到内存中。这很简单,但我今天可以创建一个文件,它将很难通过 一次读取一个字

这样做有什么问题吗

int  i = new StreamReader("file.txt").ReadToEnd().Split(new char[] {'\n'}).Length

这样做的问题是,在对大文件执行此操作时,会分配大量内存

我宁愿逐行读取文件并手动递增计数器。这可能不是一行程序,但它的内存效率要高得多


或者,您可以加载大小均匀的数据块,并计算这些数据块中的换行次数。这可能是最快的方法。

当然-它将整个流读取到内存中。这很简单,但我今天可以创建一个文件,它将很难通过

一次读取一个字符,并增加换行符上的计数

编辑-经过一些快速的研究 如果你想要简洁,想要那种闪亮的新感觉,请考虑一下:

public class StreamEnumerator : IEnumerable<char>
{
    StreamReader _reader;

    public StreamEnumerator(Stream stm)
    {
        if (stm == null)
            throw new ArgumentNullException("stm");
        if (!stm.CanSeek)
            throw new ArgumentException("stream must be seekable", "stm");
        if (!stm.CanRead)
            throw new ArgumentException("stream must be readable", "stm");

        _reader = new StreamReader(stm);
    }

    public IEnumerator<char> GetEnumerator()
    {
        int c = 0;
        while ((c = _reader.Read()) >= 0)
        {
            yield return (char)c;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
这给了你一个简洁的lambda表达式来做(或多或少)你想做的事情

我还是喜欢旧的Skool:

    public static int CountLines(Stream stm)
    {
        StreamReader _reader = new StreamReader(stm);
        int c = 0, count = 0;
        while ((c = _reader.Read()) != -1)
        {
            if (c == '\n')
            {
                count++;
            }
        }
        return count;
    }

注意:Environment.NewLine版本留给读者作为练习

假设该文件存在,并且您可以打开它,那么它就可以工作了


它的可读性和安全性都不太好…

如果您正在寻找一个简短的解决方案,我可以给您一个简单的说明,至少可以让您不必拆分结果:

int i = File.ReadAllLines("file.txt").Count;

但这与将大文件读入内存的问题是一样的。你真的应该使用streamreader,在阅读时计算换行符,直到到达文件末尾。

你发布的方法不是特别好。让我们把它分开:

// 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;
    }
}
上面的代码在任何给定时间在内存中最多保存一行文本。只要线路相对较短,它就会有效率。

可能是这样吗

string file = new StreamReader("YourFile.txt").ReadToEnd();
string[] lines = file.Split('\n');
int countOfLines = lines.GetLength(0));

这应该可以做到:

使用System.Linq;
....
int i=File.ReadLines(File.Count();

在搜索Environment.NewLine时,这不起作用,它通常是一个两个字符的字符串(CrLf)。不过,他的想法是正确的。那么,使用正则表达式搜索Environment.NewLine的实例如何?重复:这是否回答了您的问题?忘记放括号了:int i=File.ReadAllLines(“File.txt”).Count();
string file = new StreamReader("YourFile.txt").ReadToEnd();
string[] lines = file.Split('\n');
int countOfLines = lines.GetLength(0));