在C#中,我在阅读了一个看起来像这样的文本文件后得到了一个字典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 :(得分:0)
这实际上取决于每次工作的相似程度。如果您在引用树中向下导航,则需要在每个分支上执行相同的导航,递归就是您的答案。
如果在第一次导航后处理分支的方式发生根本变化,请使用单独的方法。
一般来说,首先将其编写为可读且易于使用,然后在性能成为问题时进行更改,或者需要大幅分离功能。
还要记住,有一个方法如ProbeLinesRecursive(int lineNumber)向读取它的程序员说了些什么,那就是“我将从你给我的行开始,然后继续前进,直到我用完线探测”。随着时间的推移,这种描述性编程变得非常有用。