【问题标题】:c# print recursively by traversing treec# 通过遍历树递归打印
【发布时间】:2021-05-04 21:40:58
【问题描述】:

我正在尝试遍历并打印以下树:

我的预期结果是:

State2
State2/State3
State2/State3/State4

下面是我正在尝试的代码:

    public void EA_MenuClick(EA.Repository rep, string location, string menuName, string itemName)
        {
EA.Diagram diag;
                DiagramElement diagramElementsObj = new DiagramElement();
            char[] charsToReplaceFromDiagramId = new char[] { '{', '}' };
                            diag = rep.GetContextObject();

                            diagramElementsObj.refDiagramName = diag.Name;
                            diagramElementsObj.refDiagramId = diag.DiagramGUID.Trim(charsToReplaceFromDiagramId);

                            diagramElementsObj.states = new List<State>();
                            diagramElementsObj.transitions = new HashSet<Transition>();

                            foreach (EA.DiagramObject diagramObj in diag.DiagramObjects)
                            {
                                int elementId = diagramObj.ElementID;
                                EA.Element element = rep.GetElementByID(elementId);

                                State stateObj = new State();

                              
                                    if (element.MetaType == "State")
                                    {
                                        //stateObj.name = Utilities.FormatElementName(element.Name, rep, element);
                                        FormatElementName(element.Name, rep, element);
                                        stateObj.name = stateName;
                                        diagramElementsObj.states.Add(stateObj);
                                    }
                                

                                if (element.Methods.Count > 0)
                                {
                                    GetActionsByState(element, stateObj);
                                }
                                GetAllTransitions(rep, diagramElementsObj, element);
                            }
        }

这里的 DiagramElement 是父类,它有一个名为 State 的子列表。 State 有一个名为 Name属性。我正在准备上述课程中的对象。不知道下面的递归方法能不能做到。

格式化方法如下:

public void FormatElementName(string result, EA.Repository rep, EA.Element element)
    {
        if (element.Elements.Count == 0)
        {
            stateName = result;
            return;
        }
        foreach (EA.Element child in element.Elements)
        {
            FormatElementName(result + "/" + child.Name, rep, child);
        }
    }

并以相反的顺序得到以下输出:

State2/State3/State4
State3/State4
State4

我怎样才能颠倒订单?我正在使用 c#。

【问题讨论】:

  • 不清楚打印的方式/位置。
  • 对于 Enterprise Architect 插件。在对象中分配名称,然后将其转换为 yaml
  • 仍然不清楚。如何循环行。你打一个电话。即使stateName 是包含FormatElementName 的类的属性,最后它也会有一个值。
  • 请参考更新后的帖子

标签: c# .net recursion tree tree-traversal


【解决方案1】:

我想你想要这样的东西。

FormatElementName("", rep, element);

public void FormatElementName(string prefix, EA.Repository rep, EA.Element element)
{
   string result = prefix + element.Name;
   prefix = result + "/";

   State stateObj = new State();                                   
   stateObj.name = stateName;
   diagramElementsObj.states.Add(stateObj);    

   if (element.Elements.Count == 0)
   {    
       return;
   } 
   foreach (EA.Element child in element.Elements)
   {
       FormatElementName(prefix, rep, child);
   }
 }

【讨论】:

  • 我已经添加了上面的完整方法以进行澄清。 stateobj.name 是在被调用的方法中分配的,而不是从递归方法中分配的。绝对有必要吗?我不确定。我还检查了您提供的方法,它返回了与我之前使用的相同的树,它看起来如下: - 名称:==State2State2/State3/State4 == State3State3/State4 == State4State4
  • 目前还不清楚你试图达到什么结果。据我了解,您有 DiagramObjects 根节点集合,当您迭代它时,您会为根节点创建一个状态对象。如果您的目标是为树中的每个节点创建状态对象,则必须将状态实例化和添加到diagramElementsObj.states 放入递归方法中。并且不要忘记空的初始前缀字符串。
【解决方案2】:

下面是解决方案的代码:

public void GetStateName(string result, EA.Repository rep, EA.Element element)
        {
            if (element.ParentID == 0)
            {
                stateName = result;
                return;
            }
            else
            {
                EA.Element parent = rep.GetElementByID(element.ParentID);
                GetStateName(parent.Name + "/" + result, rep, parent);
            }
        }

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 2014-03-11
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2019-01-04
    • 2012-11-13
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多