【问题标题】:Representing a chain of nodes in a human readable way以人类可读的方式表示节点链
【发布时间】:2012-11-22 03:42:20
【问题描述】:

我正在尝试表示必须逐步绘制的地铁地图类型的东西(就像它的增长一样)。

我的代码运行良好,但不可读。基本上它是一个带有递归节点和子节点的树结构,我的测试代码如下所示:

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

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

【问题讨论】:

    标签: c# tree structure recursive-datastructures


    【解决方案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
      }
    }
    

    【讨论】:

    • 有什么理由选择这个而不是 TreeNode?​​span>
    • 如果他真的想用那种“自己动手”的心态?? (当然不是 C# 大师?)
    • 你们没有注意到类 def 末尾的杂散分号 ;)
    • 这是个好主意,但不幸的是它是一棵树而不是基本链,所以它必须在不同的地方分支。
    【解决方案2】:

    为了使该代码更具可读性,我会使用具有适当名称的变量(因为我不知道您的主题域,所以我的可能不合适):

    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 实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-26
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多