动态地将数据添加到锯齿状数组?

时间:2014-04-07 18:34:50

标签: asp.net vb.net

我有一个递归函数,它根据它们的层次结构创建一个项目列表(整数用于确定哪个级别为1到10最大值)。任何给定级别都可以有x个项目。我想将所有属于同一级别的项目存储在锯齿状数组的相应索引处。这些项目不会根据它们的级别进行检索,因此当函数递归时,该级别可以在整个地方跳跃。

    Function RecurseParts(lngPartID1, lngLevel) As Object
        'this function will recursivley print the parts lists for the part ID passed in


        If IsNumeric(lngPartID1 & "") Then
            Dim objRSTemp As Object = Server.CreateObject("ADODB.Recordset")

            objRSTemp.CursorLocation = adUseClient
            objRSTemp.Open(PART_LIST_SQL & lngPartID1, objConn, adOpenForwardOnly, adLockReadOnly)
            'objRSTemp.ActiveConnection = Nothing

            If objRSTemp.eof And objRSTemp.bof Then
                'PROBLEM, WE HAVE NO RECORDS
                Response.Write("There Were No Parts For This Assembly (Part ID #:" & lngPartID1 & ")")
            Else
                'make output    

                Dim strTemp As String = String.Empty
                If lngLevel <> 1 Then strTemp = " style=""display: none;"">"
                Response.Write("<table id='tblparts" & lngCurrentLineNum & "' border=""0"" cellspacing=""0"" width=""100%"" cellpadding=""1"" " & strTemp)

                Do Until objRSTemp.EOF


                    'increase the current line num 
                    lngCurrentLineNum = lngCurrentLineNum + 1

                    'get current Part ID
                    lngCurrentPartID = objRSTemp("PartID").value

                    'reset flag
                    blnIsAssm = False

                    'loop thru array of assemblies to see if this is a parent 
                    For ctr = 0 To UBound(arrAssmList, 2)
                        If arrAssmList(0, ctr) = lngCurrentPartID Then
                            'the current part is an assembly
                            blnIsAssm = True
                            Exit For
                        ElseIf arrAssmList(0, ctr) > lngCurrentPartID Then
                            Exit For
                        End If
                    Next

                    If blnIsAssm Then
                      'recurse these parts
                        If RecurseParts(objRSTemp("PartID").value, lngLevel + 1) = True Then
                            'awesome
                        End If

                    End If

                    objRSTemp.MoveNext()
                Loop
                Response.Write("</table>")
            End If

            If objRSTemp.State Then objRSTemp.Close()
            objRSTemp = Nothing

            'RETURN FUNCTION
            RecurseParts = True
        Else
            'no PART ID passed in
            Response.Write("No Part ID Passed In")
            RecurseParts = False
        End If
    End Function

2 个答案:

答案 0 :(得分:0)

听起来像Dictionary可以在这里工作。

Dim myDict As New Dictionary(Of Integer, List(Of String))

在你的递归函数中。 {}中的部分是您必须提供的部分。

'this builds the keys as you go 
If Not myDict.ContainsKey({{key} -> your Integer}) Then
   'add key and use the From statement to add a value if know at this time
   myDict.Add({key}, New List(Of String) From {value})
Else
   myDict({key}).Add({string to insert at this level})
End If

按相反顺序列出的键:

Dim keys = myDict.Keys.OrderByDescending(Function(k) k)

答案 1 :(得分:0)

我能够创建一个List来存储所有partIE及其级别。

 Dim arrSubID As New List(Of List(Of Integer))()
Function RecurseParts(paramenters) 
   For ctr = 0 To UBound(arrAssmList, 2)
                            If arrAssmList(0, ctr) = lngCurrentPartID Then
                              'checks whether we need a new index in the list
                                If lngLevel + 1 > arrSubID.Count Then
                                    arrSubID.Add(New List(Of Integer))
                                End If
                                'adds the partID where it belongs!
                                arrSubID(lngLevel).Add(lngCurrentPartID)

                                blnIsAssm = True
                                Exit For
                            ElseIf arrAssmList(0, ctr) > lngCurrentPartID Then
                                Exit For
                            End If
                        Next
End Function