繁体   English   中英

如何在VB.Net中创建和遍历多维数组?

[英]How do you create and loop through a multidimensional array in VB.Net?

我正在尝试在VB.net中完成以下任务:

' Create multidimensional array holding parents and childs 

[100] Parent1
    [101] Child1
    [102] Child2
[200] Parent2
    [201] Child1
[300] Parent3
    [301] Child1
    [302] Child2
    [303] Child3

' Loop through multidimensional array

For Each Parent in Array
    Print parent_id parent_name

    For each Child in Parent
        Print child_id child_name
    Next
Next

输出应为:

100 Parent1
101 Child1
102 Child2
200 Parent2
201 Child1
300 Parent1
301 Child1
302 Child2
303 Child3

我知道在BV.net中创建一个一维数组,如下所示:

Dim Parents As New Dictionary(Of Integer, String) From { 
    {100, "Parent1"}, 
    {200, "Parent2"},
    {300, "Parent3"}
}

但是,我不知道如何扩展它以容纳孩子。

问题1:如何更新上面的数组以容纳每个父项的子项?

For Each循环用伪代码编写。

问题2:如何遍历多维数组以获得所需的输出?

我知道在BV.net中创建一个一维数组,如下所示:

 Dim Parents As New Dictionary(Of Integer, String) From { {100, "Parent1"}, {200, "Parent2"}, {300, "Parent3"} } 

那是字典-唯一键到值的映射-而不是一维数组。 如果只想对其进行迭代(尤其是要按顺序进行迭代),则元Tuple(Of Integer, String)列表( Tuple(Of Integer, String) )或KeyValuePair可能更合适:

Dim parents As New List(Of Tuple(Of Integer, String)) From {
    Tuple.Create(100, "Parent1"),
    Tuple.Create(200, "Parent2"),
    Tuple.Create(300, "Parent3")
}

您可以将其扩展为三个项目的元组,以给他们每个孩子:

Dim parents As New List(Of Tuple(Of Integer, String, List(Of Tuple(Integer, String))) From {
    Tuple.Create(100, "Parent1", New List(Of Tuple(Integer, String)) From { Tuple.Create(101, "Child1"), Tuple.Create(102, "Child2") }),
    Tuple.Create(200, "Parent2", New List(Of Tuple(Integer, String)) From { Tuple.Create(201, "Child1") }),
    …
}

并对其进行迭代,

For Each parent In parents
    Console.WriteLine("[{0}] {1}", parent.Item1, parent.Item2)

    For Each child In parent.Item3
        Console.WriteLine("    [{0}] {1}", child.Item1, child.Item2)
    Next
Next

但是,这些名称不是非常描述性的名称,您始终可以只创建自己的类。

Class Parent
    Public Property Number As Integer
    Public Property Name As String
    Public Property Children As New List(Of Child)()

    Public Sub New(number As String, name As String)
        Me.Number = number
        Me.Name = name
    End Sub
End Class

Class Child
    Public Property Number As Integer
    Public Property Name As String

    Public Sub New(number As String, name As String)
        Me.Number = number
        Me.Name = name
    End Sub
End Class

根据它们之间的关联方式,一个可能要继承另一个。 然后,为方便起见,可以使父级枚举; 为了更加方便,您可以给它Add一个Add方法,该方法还将允许使用From语法:

Class Parent
    Implements IEnumerable(Of Child)

    Public Property Number As Integer
    Public Property Name As String
    Public Property Children As New List(Of Child)()

    Public Sub New(number As String, name As String)
        Me.Number = number
        Me.Name = name
    End Sub

    Public Sub Add(child As Child)
        Me.Children.Add(child)
    End Sub

    Public Function GetEnumerator() As IEnumerator(Of Child) Implements IEnumerable(Of Child).GetEnumerator
        Return Me.Children.GetEnumerator()
    End Function

    Private Function GetEnumerator_() As IEnumerator Implements IEnumerable.GetEnumerator
        Return Me.GetEnumerator()
    End Function
End Class

和:

Dim parents As New List(Of Parent) From {
    New Parent(100, "Parent1") From {
        New Child(101, "Child1"),
        New Child(102, "Child2")
    },
    …
}

我的语法可能不太正确,但是您明白了。

听起来您需要的不仅仅是Dictionary或多维数组:您需要一个类。

您的父对象至少具有三个属性:

 ID
 Name
 Collection of child objects

从理论上讲,您可以处理多维对象数组中的所有内容,但您会陷入困境,试图使它们保持直线。 您需要的是一个具有表示这三个属性的属性的类。 您的parent对象和child对象都是此类的实例: child对象只是没有自己的child对象。

如果您不熟悉类的概念,则需要阅读一些内容。 阅读有关类,属性和集合类的信息。 您可能要特别注意ArrayList类,因为它可能非常有用。 (通用List<T>类将更加有用,但这是一个更高级的主题。)

这不是一个非常有效的解决方案-它将每个家庭成员彼此之间进行比较。 但是,它可以满足您的需求,并且应该教会您一些数组的工作原理。

  Sub ShowFamily()
    Dim strFamily(-1, -1) As String '0-based (indices start at zero). first index is the person, second index are the properties associated with the person
    '(*, 0) = Person's name
    '(*, 1) = Person's ID
    '(*, 2) = Person's parent's ID

    '1. Fill array with data
    Call LoadFamily(strFamily)
    '2. Go through the array looking for family members that have no parents
    For i As Integer = 0 To strFamily.GetUpperBound(0)
      If strFamily(i, 2) = "" Then
        '3. Found a parent. Output their name
        Debug.WriteLine(String.Format("{0} {1}", strFamily(i, 1), strFamily(i, 0)))
        '4. Go through the array a second time, looking for this parent's children
        For j As Integer = 0 To strFamily.GetUpperBound(0)
          If strFamily(j, 2) = strFamily(i, 1) Then 'compare child's parent ID with parent's ID - do they match?
            'found a match - output the child
            Debug.WriteLine(String.Format("    {0} {1}", strFamily(j, 1), strFamily(j, 0)))
          End If
        Next j
      End If
    Next i
  End Sub

  Sub LoadFamily(ByRef strFamily(,) As String)
    ReDim strFamily(9, 2) '9 members
    strFamily(0, 0) = "Parent1"
    strFamily(0, 1) = "100"
    strFamily(0, 2) = "" 'no parent
    '
    strFamily(1, 0) = "Parent1Child1"
    strFamily(1, 1) = "101"
    strFamily(1, 2) = "100" 'Parent1
    '
    strFamily(2, 0) = "Parent1Child2"
    strFamily(2, 1) = "102"
    strFamily(2, 2) = "100" 'Parent1
    '
    strFamily(3, 0) = "Parent2"
    strFamily(3, 1) = "200"
    strFamily(3, 2) = "" 'no parent
    '
    strFamily(4, 0) = "Parent2Child1"
    strFamily(4, 1) = "201"
    strFamily(4, 2) = "200" 'Parent2
    '
    strFamily(5, 0) = "Parent3"
    strFamily(5, 1) = "300"
    strFamily(5, 2) = "" 'no parent
    '
    strFamily(6, 0) = "Parent3Child1"
    strFamily(6, 1) = "301"
    strFamily(6, 2) = "300" 'Parent3
    '
    strFamily(7, 0) = "Parent3Child2"
    strFamily(7, 1) = "302"
    strFamily(7, 2) = "300" 'Parent3
    '
    strFamily(8, 0) = "Parent3Child3"
    strFamily(8, 1) = "303"
    strFamily(8, 2) = "300" 'Parent3
    'Add a third child to parent 1, to demonstrate that we are actually matching parents to children
    strFamily(9, 0) = "Parent1Child3"
    strFamily(9, 1) = "103"
    strFamily(9, 2) = "100" 'Parent1
  End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM