跳过文件中的行;通用扩展方法

时间:2010-10-12 06:25:49

标签: c# file

有没有更好的方法来编写此扩展方法?

public static class StreamReaderExtensions
{
    public static StreamReader SkipLines(this StreamReader reader, int lines)
    {
        for (var i = 0; i < lines; i++)
        {
            reader.ReadLine();
        }

        return reader;
    }
}

我在想这样的事情:

int linesToSkip = 3;
linesToSkip.Do(reader => reader.ReadLine());

或者:

int linesToSkip = 3;
linesToSkip.Do(() => reader.ReadLine());

但是Do()会是什么样的?

2 个答案:

答案 0 :(得分:8)

尝试使用LINQ中已定义的电源。使用此扩展方法读取行:

public static IEnumerable<string> ReadLines(this StreamReader reader)
{
    while (!reader.EndOfStream)
    {
        yield return reader.ReadLine();
    }
}

然后,如果您打开StreamReader,您的代码可能如下所示:

int linesToSkip = 3;
var lines = reader.ReadLines().Skip(linesToSkip);

享受。

答案 1 :(得分:0)

看看Eric Lippert的this article

他举了这个例子来实现这样的扩展:

public static class FileUtilities
{
    public static IEnumerable<string> Lines(string filename)
    {
        if (filename == null)
            throw new ArgumentNullException("filename");
        return LinesCore(filename);
    }

    private static IEnumerable<string> LinesCore(string filename)
    {
        Debug.Assert(filename != null);
        using(var reader = new StreamReader(filename))
        {
            while (true)
            { 
                string line = reader.ReadLine();
                if (line == null) 
                   yield break;
                yield return line;
            }
        }
    }
}

如果拥有此功能,只需使用Skip()SkipWhile()TakeWhile()等内容,即可使用LINQ的正常功能。