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