Как насчет общего решения?
Для меня первым шагом является перечисление по строкам файла (уже предоставлено ReadAllLines
,но это приводит к снижению производительности из-за заполнения всего массива string[]
, а также ReadLines
, но это доступно только с .NET 4.0).
Реализация этого довольно тривиальна:
public static IEnumerable<string> EnumerateLines(this FileInfo file)
{
using (var reader = file.OpenText())
{
while (!reader.EndOfStream)
{
yield return reader.ReadLine();
}
}
}
Следующим шагом будет просто пропустить первые две строки этой перечислимой последовательности.Это просто с использованием метода расширения Skip
.
Последний шаг - игнорирование последней строки перечислимой последовательности.Вот один способ, которым вы могли бы реализовать это:
public static IEnumerable<T> IgnoreLast<T>(this IEnumerable<T> source, int ignoreCount)
{
if (ignoreCount < 0)
{
throw new ArgumentOutOfRangeException("ignoreCount");
}
var buffer = new Queue<T>();
foreach (T value in source)
{
if (buffer.Count < ignoreCount)
{
buffer.Enqueue(value);
continue;
}
T buffered = buffer.Dequeue();
buffer.Enqueue(value);
yield return buffered;
}
}
ОК, тогда.Собрав все это вместе, мы имеем:
var file = new FileInfo(@"path\to\file.txt");
var lines = file.EnumerateLines().Skip(2).IgnoreLast(1);
Тестовый ввод (содержимое файла):
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
This is line number 5.
This is line number 6.
This is line number 7.
This is line number 8.
This is line number 9.
This is line number 10.
Вывод (из Skip(2).IgnoreLast(1)
):
This is line number 3.
This is line number 4.
This is line number 5.
This is line number 6.
This is line number 7.
This is line number 8.
This is line number 9.