动态多维数组问题

3

我有这段代码:

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

我试图改变数组维度的上界,但是出现了以下错误:"Index was outside the bounds of the array"。请问我做错了什么?

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

从二维数组到List(Of List(Of String))

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
+1 赞同 - 即使之后需要一个数组,你也可以只需将列表 ToArray。 - Jon Egerton
我该如何将二维数组转换为列表,然后再将列表转换回二维数组? - Cobold

1

如果您声明了具有x和y维度的数组,要使用超出范围的值,您必须使用redim()命令重新定义数组:

MSDN Redim命令文档

示例

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

我想能够更改任何维度的上限,但ReDim不允许这样做。 - Cobold
1
是的,ReDim 允许您重新定义每个维度...例如,ReDim Preserve intArray(10, 20, 20) 可以修改第二和第三维度。 - arthur86

0

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


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

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


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接