dejf111 Ответов: 4

Могу ли я продолжить работу после возвращения методов?


Добрый день всем, я не знаю, есть ли возможность после метода возврата продолжить или мне следует иначе построить код. Я хотел бы, чтобы после возврата я продолжил до конца txt-файла и позволил возвращаемому списку больше значений.

Что я уже пробовал:

public static string FindLineAboveAsterisks(TextReader reader)
        {
            StringBuilder sbBuilder = new StringBuilder();
            string result = reader.ReadLine();
            string line = String.Empty;
          

            while  (result is object && (line = reader.ReadLine()) is object)

        {
                int startIndex = 21;
                int length = 9;

            if (line.Contains("***"))

            {
                sbBuilder.AppendLine(result);
                return result;
                    
                }
                {
                    result = line.Substring(startIndex, length);
                }
                
            }
            return string.Empty;

Chris Copeland

Разве это не тот же самый вопрос, который вы задавали ранее? Вы пробовали использовать данный ответ Ричард Маккатчан[^], как вы отметили его как решенный?

dejf111

Я пытался, но не думаю, что у меня есть уровень

dejf111

Я больше не буду беспокоиться, это бесполезно

dejf111

но все равно спасибо

4 Ответов

Рейтинг:
2

Richard MacCutchan

Нет. То return оператор завершает метод, которому он принадлежит, поэтому больше никакой код не может выполняться там. Как я уже говорил вам вчера в Как написать более одной записи?[^], вам нужно построить список текстовых строк внутри этого метода. Начните с создания нового списка<string>. Затем для каждой строки, которую вам нужно сохранить, добавьте ее в список. Когда вы прочитаете все строки файла, то верните список вызывающему абоненту. Таким образом, вам нужно обработать входной файл только один раз.


dejf111

Я пробовал, но не думаю, что у меня есть уровень, но спасибо

BillWoodruff

+5 золотых звезд за героическое терпение :)

Richard MacCutchan

Ну, если вы собираетесь так быстро сдаться, то ваша ИТ-карьера вряд ли будет очень долгой. Если вы не уверены, как использовать некоторые функции языка, то идите и изучите документацию*, поиск статей и т. д. Есть только один способ стать опытным: усердно учиться и практиковать, практиковать, практиковать.

*Сегодня вам повезло, что OriginalGriff обеспечил вам полную реализацию.

Richard MacCutchan

Спасибо, Билл. Иногда стоит попытаться помочь.

dejf111

У меня плохо то, что я не очень хорошо владею английским языком

Richard MacCutchan

Это не важно - я полагаю, что не знаю (м)ни одного слова на вашем языке. Но большая часть документации MSDN доступна на других языках, поэтому вам следует пойти туда и проверить, поддерживается ли ваш язык.

Рейтинг:
2

Patrice T

Цитата:
Я не знаю, есть ли возможность после метода return продолжить или мне следует иначе построить код.

Возврат всегда является последней инструкцией, выполненной в данном пути.
int Myfunc() {
// path 0
if (condition) {
  // path 1
  // do stuff
  return 1;
  // will never reach this point
  }
// path 0
// do stuff
return 0;
// will never reach this point
}


Рейтинг:
15

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

О, смотрите - это работает!

Все, что я делал, это думал о задаче и разбивал ее на "управляемые куски", каждый из которых был довольно очевиден и легко выполним.
И очень быстро у нас появился рабочий код.
Так что перестаньте прыгать сразу и подумайте сначала: пять минут планирования могут сэкономить вам часы работы!


dejf111

Большое вам спасибо когда это будет сделано это постепенно выглядит проще

OriginalGriff

Вот в чем суть основ разработки: думать о задаче и разбивать ее на более мелкие, более управляемые задачи, а затем решать, как они должны взаимодействовать и что им нужно "передавать" между собой. Это затем решает, какие структуры вы будете использовать, и как они реализуются. Фактическое кодирование-это быстрый бит! :смеяться:

Richard MacCutchan

"Фактическое кодирование-это быстрый бит!"
Тебе легко говорить об этом. :)

Кстати, вышеизложенное действительно является отличным решением; почти статья.

OriginalGriff

OriginalGriff

Ладно, я попробовал:
https://www.codeproject.com/Articles/5282084/How-to-write-code-to-solve-a-problem-a-beginners-g
:смеяться:

Рейтинг:
1

Richard Deeming

Попробуйте использовать метод итератора:

public static IEnumerable<string> FindLineAboveAsterisks(TextReader reader)
{
    const int startIndex = 21;
    const int length = 9;

    string result = reader.ReadLine();
    string line;
    
    while (result != null && (line = reader.ReadLine()) != null)
    {
        if (line.Contains("***"))
        {
            yield return result;
        }
        
        // TODO: Validate that the line is long enough:
        result = line.Substring(startIndex, length);
    }
}

...

foreach (string line in FindLineAboveAsterisks(reader))
{
    Console.WriteLine(line);
}