Thank u!
*** Sent via Developersdex http://www.developersdex.com ***
> I would like to know what is the best way to store a tree structure in
> c#?
That depends on the nature of the tree. However, it's simple enough to
write your own class that maintains a tree in whatever manner is
appropriate for your data. Common tree implementations would include
references to children either via a fixed number of instance fields (e.g.
binary tree) or an instance field that holds a reference to a collection
of child nodes (e.g. a List<T> instance containing all the children for
that node).
> Are there any good implementation examples for seing how to do it?
A number of Framework classes use tree-like collections. You certainly
could examine them to learn more about different .NET implementations that
exist. For example, the Control class (Control.Controls), the TreeView
class (TreeView.Nodes, and TreeNode.Nodes), and the generic SortedList<T>
class, to name a few.
Pete
Thank u very much!
Marc
Example below - is this what you had in mind? If not - please explain
what you do want...
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
[Serializable]
public sealed class TreeNode
{
[XmlAttribute]
public string Key { get; set; }
[XmlAttribute]
public string Text { get; set; }
private List<TreeNode> nodes;
public List<TreeNode> Nodes
{
get
{
if(nodes == null) nodes = new List<TreeNode>();
return nodes;
}
}
public override string ToString()
{
return Text;
}
}
static class Program {
static void Main() {
TreeNode tree = new TreeNode {
Key = "A", Text = "Foo",
Nodes = {
new TreeNode
{
Key = "B", Text = "Bar",
Nodes = {
new TreeNode {
Key = "C", Text = "Blip"
}
}
},
new TreeNode {
Key = "D", Text = "Blop"
}
}
};
StringBuilder sb = new StringBuilder();
XmlSerializer xser = new XmlSerializer(typeof(TreeNode));
using (XmlWriter writer = XmlWriter.Create(sb))
{
xser.Serialize(writer, tree);
writer.Close();
}
string xml = sb.ToString();
Console.WriteLine(xml);
using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
{
TreeNode backAgain = (TreeNode) xser.Deserialize(reader);
}
}
}
added 2 .ctor()s for TreeNode:
public TreeNode() : this("","") { }
public TreeNode(string key, string text,
params TreeNode[] nodes)
{
Key = key;
Text = text;
if (nodes != null && nodes.Length > 0)
{
Nodes.AddRange(nodes);
}
}
and changed demo setup code:
TreeNode tree = new TreeNode("A", "Foo",
new TreeNode("B", "Bar",
new TreeNode("C", "Blip")
),
new TreeNode("D", "Blop")
);
Same result, just done differently...
Marc
To come back full-circle, XmlDocument is a fully-functional pre-defined
class for loading an arbitrary tree of data... if you want something in
between, you're going to have to be a lot more specific about what you
want (and probably write it yourself).
In System.Web.UI, there are some interfaces - IHierarchyData,
IHierarchicalEnumerable, IHierarchicalDataSource - but to be honest I
wouldn't worry unless you are using the web tree-view.
Marc