OriginalGriff
Посмотри на свой код, пожалуйста.
Это выглядит так, как будто он был брошен вместе без какой-либо мысли о том, что вы пытаетесь сделать!
Выбросьте его и подумайте о своей задаче: прочитайте файл, найдите все строки, которые находятся над строками со звездочкой, и верните их.
Итак, давайте начнем с самого начала: вам нужно вернуть более одной строки - поэтому очевидная вещь, которую нужно сделать, - это вернуть коллекцию строк вместо одной строки. Потому что, хотя вы можете вернуть их в виде одной строки, это делает жизнь намного сложнее для кода, который вызывает ваш метод - он должен "разбить его снова", чтобы использовать информацию.
Давайте изменим это:
public static List<string> FindLineAboveAsterisks(TextReader reader)
Теперь он возвращает набор строк, чтобы внешний мир мог работать с ним.
Но... почему вы передаете ему текстовый редактор? Это означает, что каждый раз, когда вы вызываете его, внешний мир должен делать работу по созданию, открытию, пропуску и закрытию читателя - что глупо. Вместо этого передайте путь и позвольте методу делать с ним то, что он хочет:
public static List<string> FindLineAboveAsterisks(string filePath)
Теперь с вызывающим абонентом, похоже, легче работать.
Давайте начнем заполнять метод: нам нужен список для возврата и обработки каждой строки в файле. Если мы хотим использовать каждую линию, то давайте просто возьмем их все и позволим системе справиться с этим! Это довольно просто:
public static List<string> FindLineAboveAsterisks(string filePath)
{
List<string> lines = new List<string>();
foreach (string line in File.ReadLines(filePath))
{
// ...
}
return lines;
}
А теперь, что нам делать с этими линиями?
Все просто; нам нужно собрать все строки, где следующая строка содержит три звездочки.
Поэтому нам нужно знать, что это была за последняя строчка. Давайте добавим, что:
public static List<string> FindLineAboveAsterisks(string filePath)
{
List<string> lines = new List<string>();
string lastLine = "";
foreach (string line in File.ReadLines(filePath))
{
// ...
lastLine = line;
}
return lines;
}
Нам нужно проверить, содержит ли текущая строка "***". Если это так, добавьте последний в коллекцию. Это тоже легко - быстро
if
тест сделает это:
public static List<string> FindLineAboveAsterisks(string filePath)
{
List<string> lines = new List<string>();
string lastLine = "";
foreach (string line in File.ReadLines(filePath))
{
if (line.Contains("***"))
{
lines.Add(lastLine);
}
lastLine = line;
}
return lines;
}
Подожди... все кончено, не так ли?
Все, что нам нужно сделать сейчас, это вызвать его и проверить:
string path = @"D:\Test Data\List of hats.txt";
foreach (string line in FindLineAboveAsterisks(path))
{
Console.WriteLine(line);
}
О, смотрите - это работает!
Все, что я делал, это думал о задаче и разбивал ее на "управляемые куски", каждый из которых был довольно очевиден и легко выполним.
И очень быстро у нас появился рабочий код.
Так что перестаньте прыгать сразу и подумайте сначала: пять минут планирования могут сэкономить вам часы работы!