给出以下对象:
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 } } }
但是我完全不知道如何映射它。
任何提示都表示赞赏。
答案 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
作为父级。
最初使用null
为curParent
参数调用它,然后为您遇到的每个节点递归调用它。
答案 2 :(得分:0)
如何将其转换为XmlDocument。我在这里写了一篇关于这方面的文章:
您可以忽略有关显示层次结构的部分。