Skip to content

Instantly share code, notes, and snippets.

@hellboy81
Created June 19, 2015 06:44
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hellboy81/e5f36a1a3dc05bf8570d to your computer and use it in GitHub Desktop.
Save hellboy81/e5f36a1a3dc05bf8570d to your computer and use it in GitHub Desktop.
public class TreeNode<TName, TTag> {
internal TreeNodeCollection<TName, TTag> nodes;
public TreeNode(TName name) {
Name = name;
}
public TName Name { get; set; }
public TTag Tag { get; set; }
public TreeNode<TName, TTag> Parent { get; set; }
public TreeNodeCollection<TName, TTag> Nodes {
get {
if (this.nodes == null) {
this.nodes = new TreeNodeCollection<TName, TTag>(this);
}
return this.nodes;
}
}
}
public class TreeNodeCollection<TName, TTag> : IEnumerable<TreeNode<TName, TTag>> {
private TreeNode<TName, TTag> m_parent;
private List<TreeNode<TName, TTag>> m_innerList = new List<TreeNode<TName, TTag>>();
internal TreeNodeCollection(TreeNode<TName, TTag> parent) {
m_parent = parent;
}
public TreeNode<TName, TTag> this[int index] {
get {
if (index < 0 || index >= m_innerList.Count) throw new ArgumentOutOfRangeException("index");
return m_innerList[index];
}
}
public int Count {
get { return m_innerList.Count; }
}
public void Add(TreeNode<TName, TTag> node) {
node.Parent = m_parent;
m_innerList.Add(node);
}
public void Remove(TreeNode<TName, TTag> node) {
m_innerList.Remove(node);
}
public TreeNode<TName, TTag> Parent {
get {
return m_parent;
}
}
public IEnumerator<TreeNode<TName, TTag>> GetEnumerator()
{
return m_innerList.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
@hellboy81
Copy link
Author

Generic tree implementation inspired on WinForms's TreeView TreeNode/ TreeNodeCollection

TName is generic type of all nodes name (usually string)
TTag is generic type of all nodes tags (usually struct/own class definition )

This tag can be attached both on leaf and non-leaf nodes nodes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment