解决文本文件的递归方法

时间:2014-11-11 14:24:13

标签: c# recursion

在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;

这有意义吗?或者我会更好地为每个案例使用单一方法而不回忆相同的方法?

1 个答案:

答案 0 :(得分:0)

这实际上取决于每次工作的相似程度。如果您在引用树中向下导航,则需要在每个分支上执行相同的导航,递归就是您的答案。

如果在第一次导航后处理分支的方式发生根本变化,请使用单独的方法。

一般来说,首先将其编写为可读且易于使用,然后在性能成为问题时进行更改,或者需要大幅分离功能。

还要记住,有一个方法如ProbeLinesRecursive(int lineNumber)向读取它的程序员说了些什么,那就是“我将从你给我的行开始,然后继续前进,直到我用完线探测”。随着时间的推移,这种描述性编程变得非常有用。