我正在尝试按照Tree data structure in C#
实现以下树结构类delegate void TreeVisitor<T>(T nodeData);
class NTree<T>
{
T data;
LinkedList<NTree<T>> children;
public NTree(T data)
{
this.data = data;
children = new LinkedList<NTree<T>>();
}
public void addChild(T data)
{
children.AddFirst(new NTree<T>(data));
}
public NTree<T> getChild(int i)
{
foreach (NTree<T> n in children)
if (--i == 0) return n;
return null;
}
public NTree<T> getChild( T data )
{
foreach (NTree<T> n in children)
{
if (n.data.Equals(data))
{
return n;
}
}
return null;
}
public void traverse(NTree<T> node, TreeVisitor<T> visitor)
{
visitor(node.data);
foreach (NTree<T> kid in node.children)
traverse(kid, visitor);
}
}
我想以XML格式输出对象的实例,但是我很难保持子/父层次结构的存在
到目前为止我已经
了NTree<string> root = new NTree<string>( "Electronic" );
root.addChild( "Techno" );
root.getChild( "Techno" ).addChild( "Detroit" );
root.getChild( "Techno" ).addChild( "Gabba" );
root.addChild( "House" );
root.getChild( "House" ).addChild( "Deep" );
root.getChild( "House" ).addChild( "Ambient" );
root.getChild( "House" ).addChild( "Chicago" );
XElement treeAsXml = new XElement("Root");
root.traverse( root, new TreeVisitor<string>( this.ConvertNodeToXml ) );
private void ConvertNodeToXml( string nodeData )
{
XElement node = new XElement( "Node" );
node.Value = nodeData;
this.treeAsXml.Add( node );
}
这只是给了我:
<Root><Node>Electronic</Node><Node>House</Node><Node>Chicago</Node><Node>Ambient</Node><Node>Deep</Node><Node>Techno</Node><Node>Gabba</Node><Node>Detroit</Node></Root>
如何正确输出,理想情况下如下
<Node value="Electronic">
<Node value="Techno">
<Node value="Detroit" />
<Node value="Gabba" />
</Node>
<Node value="House">
<Node value="Deep" />
<Node value="Ambient" />
<Node value="Chicago" />
</Node>
</Node>
答案 0 :(得分:1)
问题是你的委托没有上下文,它不知道它的父级,它不知道它的子节点,因为它只获取节点的数据。您可能需要更改委托以包含某种类型的上下文,或者您可以将其作为扩展方法来执行:
public static class NTreeXmlHelper
{
public static XElement TreeAsXml<T>(this NTree<T> node)
{
XElement element = new XElement("Node",
new XAttribute("value", node.data));
foreach (var child in node.children)
{
element.Add(TreeAsXml(child));
}
return element;
}
}
要实现此功能,您必须公开children
和data
属性。
要使用它,请执行以下操作:
NTree<string> root = new NTree<string>("Electronic");
root.addChild("Techno");
root.getChild("Techno").addChild("Detroit");
root.getChild("Techno").addChild("Gabba");
root.addChild("House");
root.getChild("House").addChild("Deep");
root.getChild("House").addChild("Ambient");
root.getChild("House").addChild("Chicago");
treeAsXml = root.TreeAsXml();
Console.WriteLine(treeAsXml.Tostring());