C# 列表到节点树(类)

C# 列表到节点树(类),c#,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 Rou

鉴于以下目标:

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 };
然而,我完全不知道如何绘制地图


任何提示都非常感谢。

听起来您只需要向
Round
类添加
节点
集合属性,或者如果无法修改该类,请为其创建节点包装类:

public class Round 
{
   public Round Parent { get; set; }
   public int Depth { get; set; }
   public string Value { get; set; }
   public IList<Round> Nodes { get; set; }
}
公开课轮
{
公共轮父{get;set;}
公共整数深度{get;set;}
公共字符串值{get;set;}
公共IList节点{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;
}
//假设您有一个包装圆形对象的NodeWrapper结构
公共IList构建树(列表)
{         
字典映射=新字典();
列表根=新列表();
//顺序列表并遍历
foreach(list.OrderBy中的圆形节点(r=>r.Depth))
{
NodeWrapper=新的NodeWrapper(节点);
如果(node.Depth==0){
添加(包装纸);
}否则{
var parentWrapper=map[node.Parent];
parrentWrapper.AddChild(包装器);
}
添加(节点,包装器);
}
回归根;
}

如果您所说的“映射”是指如图所示的打印输出,那么您需要的是递归的
打印(列表节点,圆形)
方法,该方法打印出
节点
中具有
curParent
作为父节点的每个节点


对于
curParent
参数,首先使用
null
调用它,然后针对遇到的每个节点递归调用它

将其转换为XmlDocument怎么样。我在博客上写了一个方法:


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

是的,这将是一种简单的解决方法。但问题是,这个
Round
类是在异步方法的深处创建的,因此不允许将其添加为子节点,而只指定其父节点.Ohh。。我明白你的意思。您确实需要创建节点结构,然后编写一个构建树方法,该方法获取列表并构建树或林(如果有多个根节点)。想象一下:一个爬虫,它执行数千个异步web请求。对于每个请求,它都会创建一个
Round
对象,并将其添加到线程安全集合中-同时它会监视
Round
对象导致web请求的内容-然后将该
Round
对象设置为
父对象
-这样,就不可能为每个
收集
节点
,因为我无法访问任何以前添加的
对象,但是
父对象
。你是说要在线执行此操作?您仍然需要使用某种结构才能反向引用以前的对象。如果您需要快速插入和检索,那么哈希和自平衡树是您的朋友。不,一点也不。你的回答恰到好处!感谢您的时间和帮助。我所说的
映射
是指将
列表
转换为具有给定结构的
列表
(或类似)。这在概念上是相同的过程,只是您需要一个可以容纳子列表的节点类型。
映射(列表轮次,轮次curParent,节点节点)
 // 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;
}