动态多维数组问题

问题描述 投票:2回答:5

我有这个代码:

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
5个回答
3
投票

您无法像.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

从2-D到列表(列表(字符串))

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

0
投票

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


0
投票

如果使用维x和y声明数组,要使用出站值,必须使用redim()命令重新排列数组:

MSDN Redim Command Doc

例:

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

0
投票

我自己做了这个:

   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

它适用于2D数组,但可以通过添加尺寸的ParamArray进行修改以使用无限数量的数组。


0
投票

我不知道何时引入了这种语法,但您可以使用以下命令定义具有动态大小的数组:

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语句更好。

© www.soinside.com 2019 - 2024. All rights reserved.