Рекурсивный метод для решения текстового файла

1

В С# я получаю словарь dict после чтения в текстовом файле, который выглядит как это

#33=CLOSED_SHELL('',(#34,#35,#36,#37,#38,#39));
#34=ADVANCED_FACE('',(#46),#40,.F.);
#35=ADVANCED_FACE('',(#47),#41,.F.);
#36=ADVANCED_FACE('',(#48),#42,.F.);
#37=ADVANCED_FACE('',(#49),#43,.F.);
#38=ADVANCED_FACE('',(#50),#44,.T.);
#39=ADVANCED_FACE('',(#51),#45,.F.);
#40=PLANE('',#127);
#41=PLANE('',#128);
#42=PLANE('',#129);
#43=PLANE('',#130);
#44=PLANE('',#131);
#45=PLANE('',#132);
#46=FACE_OUTER_BOUND('',#52,.T.);
#47=FACE_OUTER_BOUND('',#53,.T.);
#48=FACE_OUTER_BOUND('',#54,.T.);
#49=FACE_OUTER_BOUND('',#55,.T.);
#50=FACE_OUTER_BOUND('',#56,.T.);
#51=FACE_OUTER_BOUND('',#57,.T.);
#52=EDGE_LOOP('',(#58,#59,#60,#61));
#53=EDGE_LOOP('',(#62,#63,#64,#65));
#54=EDGE_LOOP('',(#66,#67,#68,#69));
#55=EDGE_LOOP('',(#70,#71,#72,#73));
#56=EDGE_LOOP('',(#74,#75,#76,#77));
#57=EDGE_LOOP('',(#78,#79,#80,#81));
//... this goes on for a couple of other elements

Как видите, каждая строка содержит несколько ссылок для другой строки. Каждая ссылка # в начале уникальна, так что это ключи в dict. Поэтому я использую этот метод для решения каждой категории шаг за шагом:

 private void RecursiveMethod(Dictionary<string, string> dict, Step stepObj, List<List<string>> getList, Action<List<string>> setList)
    {

        foreach(var item in getList.ToList())
        {
            for(int valuesIndex = 1; valuesIndex < item.Count - 1; valuesIndex++)
            {
                var key = item[valuesIndex];
                string values;
                if(dict.TryGetValue(key, out values))
                {
                    setList(SplitValues(values));
                }
            }
        }
    }

Поэтому мои мысли включают интеграцию оператора switch/case для каждого имени, подобного этому

case "FACE_OUTER_BOUND":
    // set list for FACE_OUTER_BOUND...
    // ...then call RecursiveMethod(...) again which selects case "EDGE_LOOP" and so on
    break;

Имеет ли это смысл? Или мне лучше использовать одиночные методы для каждого случая, не напомнив тот же метод?

  • 0
    Назвать вашу функцию RecursiveMethod ужасно, вы должны называть ее исходя из того, что делает функция. Точно так же заголовок вашего вопроса не должен быть «с использованием рекурсивного метода», а должен дать краткое описание проблемы.
  • 0
    Я использовал RecursiveMethod (...) просто для примера я обновил заголовок
Показать ещё 2 комментария
Теги:
recursion

1 ответ

0
Лучший ответ

Это действительно зависит от того, насколько похожа работа будет каждый раз. Если при перемещении вниз по дереву ссылок вам нужно выполнить ту же навигацию по каждой ветки, рекурсивный ответ.

Если после первой навигации способ обработки ветвей радикально изменяется, используйте отдельный метод.

В общем, напишите, чтобы это было легко читаемо и легко работать сперва, а затем измените его, если производительность становится проблемой или вам необходимо резко отделить функциональность.

Помните также, что наличие метода, такого как ProbeLinesRecursive (int lineNumber), что-то говорит программисту, который его читает, то есть "Я начну с строки, которую вы мне дадите, а затем продолжайте, пока не закончите строки, чтобы проверить". Такое описательное программирование становится чрезвычайно полезным, чем больше проект со временем.

  • 0
    Хорошо, это имеет смысл. Я постараюсь реализовать каждый метод отдельно, а потом постараюсь создать рекурсивный метод. Возможно, было бы даже лучше сначала завершить алгоритм, чтобы он заработал, чем бесконечно повышать производительность.
  • 1
    Очень верные чувства. В конце концов, код верен, если он работает :) Вы можете (и, несомненно, сможете) вернуться к нему позже, когда другие части приложения будут запущены и запущены.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню