1

给定以下对象:

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 } } }

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

任何提示表示赞赏。

4

3 回答 3

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;
}
于 2013-11-13T22:44:10.677 回答
0

如何将其转换为 XmlDocument。我在博客上写了一个方法来做到这一点:

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

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

于 2013-11-13T22:47:19.023 回答
0

如果map你的意思是像你展示的那样打印出来,那么你需要的是类似于递归Print(List<Rount> nodes, Round curParent);方法的东西,它打印出作为父节点nodes的每个节点。curParent

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

于 2013-11-13T22:45:37.127 回答