Пропустить строки в файле;универсальные методы расширения - PullRequest
3 голосов
/ 12 октября 2010

Есть ли лучший способ написать этот метод расширения?

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()? 1011 *

Ответы [ 2 ]

8 голосов
/ 12 октября 2010

Попробуйте использовать мощность, уже определенную в LINQ.Используйте этот метод расширения для чтения строк:

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

Тогда, если у вас есть открытое StreamReader, ваш код может выглядеть так:

0 голосов
/ 13 октября 2010

Взгляните на эту статью от Эрика Липперта.

Он приводит этот пример для реализации такого расширения:

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;
            }
        }
    }
}

Если у вас есть эта функция, просто используйте обычную мощность LINQ, используя такие вещи, как Skip(), SkipWhile(), TakeWhile() и т. Д. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...