我想在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:如何循环通过多维数组来获取我需要的输出?
答案 0 :(得分:1)
我知道BV.net中的一维数组创建如下:
Dim Parents As New Dictionary(Of Integer, String) From { {100, "Parent1"}, {200, "Parent2"}, {300, "Parent3"} }
这是一本字典 - 唯一键到值的映射 - 而不是一维数组。如果你只是想迭代它(特别是如果你想按顺序这样做),元组列表(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
方法,这样也可以使用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")
},
…
}
我的语法可能不是很正确,但你明白了。
答案 1 :(得分:0)
听起来你需要的不仅仅是Dictionary
或多维数组:你需要一个班级。
您的父对象至少有三个属性:
ID
Name
Collection of child objects
虽然理论上可以处理多维对象数组中的所有内容,但是你可以将自己绑在一起试图让它保持平直。你需要的是一个具有代表这三个属性的属性的类。您的parent
和child
对象都是此类的实例:child
对象不会拥有自己的child
个对象。
如果你不熟悉课程的概念,你需要做一些阅读。阅读有关类,属性和集合类的信息。您可能需要特别注意ArrayList
类,因为它可能非常有用。 (通用List<T>
类会更有用,但这是一个更高级的主题。)
答案 2 :(得分:0)
这不是一个非常有效的解决方案 - 它将每个家庭成员与其他每个家庭成员进行比较。但是,它可以满足您的需求,并且可以教您一些有关数组如何工作的知识。
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