VB.Net/Generics/Generic Tree
Define and use a generic Tree data structure
<source lang="vbnet"> Imports System Imports System.Windows.Forms Imports System.Collections.Generic Imports System.ruponentModel Public Class MainClass
Shared Sub Main() Dim family_tree As New Tree(Of Person) Dim root As TreeNode(Of Person) = _ family_tree.MakeRoot(New Person("Root")) Dim child1 As TreeNode(Of Person) = _ root.AddChild(New Person("First Level Node 1")) Dim child2 As TreeNode(Of Person) = _ root.AddChild(New Person("First Level Node 2")) child1.AddChild(New Person("Leap 1")) child1.AddChild(New Person("Leap 2")) child2.AddChild(New Person("Leap 3")) child2.AddChild(New Person("Leap 4")) " Display the result. Console.WriteLine(family_tree.ToString()) End Sub
End Class
Public Class Person
Public Name As String Public Sub New(ByVal new_name As String) Name = new_name End Sub Public Overrides Function ToString() As String Return Name End Function
End Class
Public Class Tree(Of data_type)
Private m_Root As TreeNode(Of data_type) = Nothing <Description("The tree"s root node."), _ Category("Data")> _ Public Property Root() As TreeNode(Of data_type) Get Return m_Root End Get Set(ByVal value As TreeNode(Of data_type)) m_Root = value End Set End Property Public Sub Clear() m_Root = Nothing End Sub Public Function MakeRoot(ByVal node_item As data_type) As TreeNode(Of data_type) m_Root = New TreeNode(Of data_type)(node_item) Return m_Root End Function Public Overrides Function ToString() As String Return m_Root.ToString() End Function
End Class Public Class TreeNode(Of data_type)
Public NodeObject As data_type Public Children As New List(Of TreeNode(Of data_type)) Public Sub New(ByVal node_object As data_type) NodeObject = node_object End Sub Public Function AddChild(ByVal node_item As data_type) As TreeNode(Of data_type) Dim child_node As New TreeNode(Of data_type)(node_item) Children.Add(child_node) Return child_node End Function Public Shadows Function ToString(Optional ByVal indent As Integer = 0) As String Dim txt As String txt = New String(" "c, indent) & NodeObject.ToString & vbCrLf For Each child As TreeNode(Of data_type) In Children txt &= child.ToString(indent + 2) Next child Return txt End Function
End Class
</source>
Generic Tree
<source lang="vbnet"> Imports System.Collections Public Class MainClass
Public Shared Sub Main() Dim rootNode, child1 As TreeNode(Of Employee) rootNode = New TreeNode(Of Employee)(New Employee(111, "A")) child1 = rootNode.AddChild(New Employee(222, "B")) rootNode.AddChild(New Employee(333, "C")) child1.AddChild(New Employee(444, "D")) child1.AddChild(New Employee(555, "E")) Console.WriteLine(rootNode) End Sub
End Class
Public Class TreeNode(Of T)
Public Data As T Private _childNodes As ArrayList Public Sub New(ByVal nodeData As T) Me.Data = nodeData Me._childNodes = New ArrayList End Sub Public ReadOnly Property Children() As TreeNode(Of T)() Get Return Me._childNodes.ToArray() End Get End Property Default Public ReadOnly Property Item(ByVal index As Long) As TreeNode(Of T) Get Return Me._childNodes(index) End Get End Property Public Function AddChild(ByVal nodeData As T) As TreeNode(Of T) Dim newNode As TreeNode(Of T) = New TreeNode(Of T)(nodeData) Me._childNodes.Add(newNode) Return newNode End Function Overrides Function ToString() As String Return Me.Data.ToString() End Function
End Class
Public Class Employee
Private _id As Integer Private _name As String Public Sub New(ByVal id As Integer, ByVal name As String) Me._id = id Me._name = name End Sub Public Overrides Function ToString() As String Return Me._name End Function
End Class
</source>