В С# я получаю словарь 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;
Имеет ли это смысл? Или мне лучше использовать одиночные методы для каждого случая, не напомнив тот же метод?
Это действительно зависит от того, насколько похожа работа будет каждый раз. Если при перемещении вниз по дереву ссылок вам нужно выполнить ту же навигацию по каждой ветки, рекурсивный ответ.
Если после первой навигации способ обработки ветвей радикально изменяется, используйте отдельный метод.
В общем, напишите, чтобы это было легко читаемо и легко работать сперва, а затем измените его, если производительность становится проблемой или вам необходимо резко отделить функциональность.
Помните также, что наличие метода, такого как ProbeLinesRecursive (int lineNumber), что-то говорит программисту, который его читает, то есть "Я начну с строки, которую вы мне дадите, а затем продолжайте, пока не закончите строки, чтобы проверить". Такое описательное программирование становится чрезвычайно полезным, чем больше проект со временем.
RecursiveMethod
ужасно, вы должны называть ее исходя из того, что делает функция. Точно так же заголовок вашего вопроса не должен быть «с использованием рекурсивного метода», а должен дать краткое описание проблемы.