【问题标题】:Dynamic Multi-Dimensional array problem动态多维数组问题
【发布时间】:2017-12-30 01:26:25
【问题描述】:

我有这个代码:

Module Module1
    Dim x As Integer = 1
    Dim y As Integer = 1
    Dim arr(x, y) As String

    Sub Main()
        x += 2
        y += 3

        For ix = 0 To x
            For iy = 0 To y
                arr(ix, iy) = String.Format("{0}:{1}", ix, iy)
            Next
        Next

        For ix = 0 To x
            For iy = 0 To y
                Console.WriteLine(arr(ix, iy))
            Next
        Next

        Console.Read()
    End Sub

End Module

我正在尝试更改数组维度的上限。但是我收到了这个错误:“索引超出了数组的范围”。我做错了什么?

【问题讨论】:

    标签: .net vb.net


    【解决方案1】:

    您不能像在 .NET 中那样更改数组的上限。如果您需要一个动态大小的数组,我建议您查看List,因为它允许您完成所有这些操作。

    你会想做这样的事情:

    Dim yourStrings AS List(Of List(Of String)) = New List(Of New List(Of String)
    

    要将其转换为二维数组:

    Dim maxListLength As Integer = 0
    For Each subList In yourStrings
        maxListLength = If(subList.Length > maxListLength, subList.Length, maxListLength)
    Next
    
    Dim yourArray(yourString.Length - 1, maxListLength -1) As String
    
    Dim x As Integer = 0
    Dim y As Integer = 0
    
    For Each subList In yourString
        For Each str In subList
            yourArray(x, y) = str
            y = y + 1
        Next
        x = x + 1
    Next
    

    从二维到列表(列表(字符串))

    Dim yourList As List(Of List(Of String)) = New List(Of List(Of String))
    
    For i = 0 To ArrayXSize
        Dim thisXString = New List(Of String)
        For j = 0 To ArrayYSize
           thisXStrings.Add(yourArray(i,j))
        Next
        yourList.Add(thisXStrings)  
    Next
    

    【讨论】:

    • +1 借调 - 即使您之后需要一个数组,您也可以只 ToArray 列表。
    • 如何将二维数组转换为列表,然后将列表转换回二维数组?
    【解决方案2】:

    如果您声明具有维度 x 和 y 的数组,要使用出站值,您必须使用 redim() 命令重新调整数组:

    MSDN Redim Command Doc

    示例

    Dim intArray(10, 10, 10) As Integer
    ReDim Preserve intArray(10, 10, 20)
    

    【讨论】:

    • 我希望能够更改任何维度的上限,但 ReDim 不允许这样做。
    • 是的,redim 允许你重做每个维度... ReDim Preserve intArray(10, 20, 20) 例如修改第二和第三维度。
    【解决方案3】:

    您可以根据需要使用ReDim 重新分配内存。

    【讨论】:

      【解决方案4】:

      这是我自己做的:

         Private Function MultiReDim(ByVal a As Array, ByVal dimOne As Short, ByVal dimTwo As Short) As String(,)
              Dim newArr(dimOne, dimTwo) As String
              For x = 0 To newArr.GetUpperBound(0)
                  For y = 0 To newArr.GetUpperBound(1)
                      If x <= a.GetUpperBound(0) AndAlso y <= a.GetUpperBound(1) Then
                          newArr(x, y) = a(x, y)
                      Else
                          newArr(x, y) = Nothing
                      End If
      
                  Next
              Next
      
              Return newArr
          End Function
      

      它适用于二维数组,但可以通过添加维度的 ParamArray 进行修改以适用于无限数量的数组。

      【讨论】:

        【解决方案5】:

        我不知道这个语法是什么时候引入的,但是你可以定义一个动态大小的数组:

        Dim arr As String(,) = New String(x,y){}
        

        或者干脆

        Dim arr = New String(x,y){}
        

        或使用原始示例

        Module Module1
        
            Dim x As Integer = 1
            Dim y As Integer = 1
            Dim arr(x, y) As String
        
            Sub Main()
                x += 2
                y += 3
        
                arr = New String(x,y){}
        
                For ix As Integer = 0 To x
                    For iy As Integer = 0 To y
                        arr(ix, iy) = String.Format("{0}:{1}", ix, iy)
                    Next
                Next
        
                For ix As Integer = 0 To x
                    For iy As Integer = 0 To y
                        Console.WriteLine(arr(ix, iy))
                    Next
                Next
        
                Console.Read()
            End Sub
        
        End Module
        

        (未测试)。

        我认为这种语法比旧的(VB6 风格)ReDim 语句更可取。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-19
          • 1970-01-01
          • 2014-10-15
          • 2014-01-12
          • 1970-01-01
          • 2021-01-02
          • 2016-07-22
          相关资源
          最近更新 更多