以人类可读的方式表示节点链

时间:2012-11-22 03:42:21

标签: c# tree structure recursive-datastructures

我正试图代表一个必须逐步绘制的地铁地图类型的东西(如它的成长)。

我的代码完美无缺但却难以理解。基本上它是一个带有递归节点和子节点的树结构,我的测试代码如下所示:

        Children.Add(new TrackLine(800));
        Children[0].Children.Add(new TrackSpot());
        Children[0].Children[0].Children.Add(new TrackSplitter());

        Children[0].Children[0].Children[0].Children.Add(new TrackRotate(-45));
        Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackColorChange(Color.Red));
        Children[0].Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackLine(100));
        Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackRotate(45));
        Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children[0].Children.Add(new TrackLine(200));

有没有人对如何解决这个烂摊子有任何建议?

2 个答案:

答案 0 :(得分:1)

你正在寻找一种方法将它添加到没有孩子的最深的孩子身上吗?

class Node
{
  List<Node> children ;

  public void addNode( Node newNode )
  {
    if( children.Count > 0 )
      children[0].addNode( newNode ) ; // recursive call
      // to ask first child to add newNode to it
    else
      children.Add( newNode ) ;        // just add it to the children list of THIS node
  }
}

答案 1 :(得分:0)

为了使代码更具可读性,我会使用具有适当名称的变量(因为我不知道你的主题域,我的可能不合适):<​​/ p>

Children.Add(new TrackLine(800));
var lineA = Children[0];

lineA.Children.Add(new TrackSpot());
var spotA = lineA.Children[0];

spotA.Children.Add(new TrackSplitter());
var splitterA = spotA.Children[0];

splitterA.Children.Add(new TrackRotate(-45));
var rotateNeg45 = splitterA.Children[0];

rotateNeg45.Children.Add(new TrackColorChange(Color.Red));
var colorRed = rotateNeg45.Children[0];

colorRed.Add(new TrackLine(100));
var lineB = colorRed.Children[0];

lineB.Children.Add(new TrackRotate(45));
var rotatePos45 = lineB.Children[0];

rotatePos45.Children.Add(new TrackLine(200));
var lineC = rotatePos45.Children[0];

另一种方法是使用字符串作为Children的索引,如下所示:

    Children.Add(new TrackLine(800));
    Children["lineA"].Children.Add(new TrackSpot());
    Children["lineA"].Children["spotA"].Children.Add(new TrackSplitter());

但是我可能不会这样做,因为管理字符串常量本身就是一团糟,可能需要更改Children实现。