问题描述
我正在尝试遍历并打印以下树:
我的预期结果是:
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,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,child);
}
}
并以相反的顺序获得以下输出:
State2/State3/State4
State3/State4
State4
我怎样才能颠倒顺序?我正在使用 c#。
解决方法
我想你想要这样的东西。
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,child);
}
}
,
以下是解决方案的代码:
public void GetStateName(string result,EA.Element element)
{
if (element.ParentID == 0)
{
stateName = result;
return;
}
else
{
EA.Element parent = rep.GetElementByID(element.ParentID);
GetStateName(parent.Name + "/" + result,parent);
}
}