VB.Net/Generics/Generic Tree

Материал из VB Эксперт
Перейти к: навигация, поиск

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>