StreamReader 获取下一行并跳过空行

StreamReader get next line and skip over empty lines

我正在使用 StreamReader 读取文件。这些文件有时在其他行之间有空行。中间空行的数量可以是任意数量。让我的 StreamReader 跳过所有空行直到读取非空行的最佳方法是什么?

我有一个在 while 循环中调用的函数:

/// <summary>
/// Moves the stream to the next non-empty line, and returns it. 
/// </summary>
/// <param name="srFile"></param>
private string GetNextLine(StreamReader srFile)
{
    string line = srFile.ReadLine();
    if (String.IsNullOrWhiteSpace(line))
        GetNextLine(srFile);
    return line;
}

一切似乎都很好,但由于某种原因,这不起作用。每当行不为空时, return 行确实会被命中,但由于某种原因,会进行更多的递归 'GetNextLine()' 调用。谁能看出我做错了什么,或者提供解决方案?

您忘记了 return 递归调用的结果:

private string GetNextLine(StreamReader srFile)
{
    string line = srFile.ReadLine(); 
    if (String.IsNullOrWhiteSpace(line))
        return GetNextLine(srFile); // here, but can you spot infinite loop?
    return line;
}

请注意,您还应该处理文件结尾。例如。 return null 如果到文件末尾没有非空行:

private string GetNextLine(StreamReader srFile)
{
    string line = srFile.ReadLine();
    if (line == null || !String.IsNullOrWhiteSpace(line))
       return line; 

    return GetNextLine(srFile);
}

此解决方案避免递归并处理任意数量的空行:

private string GetNextLine(StreamReader srFile)
{
    string line;
    do
    {
        line = srFile.ReadLine();
        if (line == null)
            return null; // end of file
    } while (line.Length == 0); // empty line

    return line; // here line is not empty
}