列表到节点树(有点)

时间:2013-11-13 22:38:04

标签: c#

给出以下对象:

public class Round 
{
   public Round Parent { get; set; }
   public int Depth { get; set; }
   public string Value { get; set; }
}

以及以下代码......

var rounds = new List<Round>();

var a1 = new Round { Depth = 0, Value = "a1" };
var b1 = new Round { Depth = 1, Value = "b1", Parent = a1 };
var c1 = new Round { Depth = 2, Value = "c1", Parent = b1 };
var b2 = new Round { Depth = 1, Value = "b1", Parent = a1 };
var a2 = new Round { Depth = 0, Value = "a2", };
var b2 = new Round { Depth = 1, Value = "b2", Parent = a2 };

现在我想将此List映射到某种类似于以下的Node结构:

Node { 
    Value = "a1", 
    Depth = 0, 
    Nodes = Nodes[] { 
        Node { 
            Value = "b1", 
            Depth = 1, 
            Nodes = Nodes[] { 
                Node { Value = "c1", Depth = 2 } } },
        Node {
            Value = "b2",
            Depth = 1 } } }

Node {
    Value = "a2",
    Depth = 0, 
    Nodes = Nodes[] {
        Node {
            Value = "b2",
            Depth = 1 } } }

但是我完全不知道如何映射它。

任何提示都表示赞赏。

3 个答案:

答案 0 :(得分:2)

听起来您只需要向Nodes类添加Round集合属性,或者如果您无法修改该类,请为其创建一个Node-wrapper类:

public class Round 
{
   public Round Parent { get; set; }
   public int Depth { get; set; }
   public string Value { get; set; }
   public IList<Round> Nodes { get; set; }
}

为了从节点列表构建树结构,我将使用此策略:

  • 按深度排序列表,升序
  • 将所有节点放在哈希集中以供快速参考
  • 一次性构建树

以下是一个例子:

 // Assuming you have a NodeWrapper structure that wraps the Round objects
 public IList<NodeWrapper> BuildTrees(List<Round> list)
 {         
     Dictionary<Round, NodeWrapper> map = new Dictionary<Round, NodeWrapper>();

     List<NodeWrapper> roots = new List<NodeWrapper>();

     // order list and iterate through
     foreach(Round node in list.OrderBy(r => r.Depth))
     {
        NodeWrapper wrapper = new NodeWrapper(node);
        if(node.Depth == 0) {
            roots.Add(wrapper);                
        } else {
            var parentWrapper = map[node.Parent];
            parrentWrapper.AddChild(wrapper);
        }
        map.Add(node, wrapper);
     }

     return roots;
}

答案 1 :(得分:0)

如果按map表示打印出来就像你已经显示的一样,那么你所需要的就是递归Print(List<Rount> nodes, Round curParent);方法,它打印出nodes中的每个节点将curParent作为父级。

最初使用nullcurParent参数调用它,然后为您遇到的每个节点递归调用它。

答案 2 :(得分:0)

如何将其转换为XmlDocument。我在这里写了一篇关于这方面的文章:

http://weblogs.asp.net/stevewellens/archive/2009/01/01/from-table-to-treeview-displaying-hierarchies.aspx

您可以忽略有关显示层次结构的部分。