2D数组抛出索引超出绑定的异常

时间:2014-06-12 17:33:55

标签: vb.net asp.net-mvc-4

我正在制作一个程序而且我一直收到错误Index was outside the bounds of the array但我无法弄清楚原因。我尝试了设置2D数组的所有不同版本。 以下是我现在设置的方法

Dim dataArray(,) As Array = New Array(,) {{}}

这是我的循环

    Dim x As Integer
    Dim DT As DataTable
    Dim TA As New DSOldOrdersTableAdapters.TA
    DT = getOldOrders()
    For x = 0 To DT.Rows.Count - 1
        dataArray(0, x) = DT.Rows(x).Item("SO")
        dataArray(1, x) = (DT.Rows(x).Item("Customer"))
        dataArray(2, x) = (DT.Rows(x).Item("ShipBy"))
    Next

3 个答案:

答案 0 :(得分:3)

您正在声明一个长度为0的数组。这意味着它将无法保存任何数据。所有索引都将超出范围。随着项目的添加,数组不会自动增长。因此,数组通常只应在数组大小固定(不变)的情况下使用。例如:

Dim dataArray(2, 2) As Object  ' Creates a 3x3 array of objects

如果您希望它在添加项目时自动增长,您通常需要使用List(Of T)而不是数组。例如:

Public Class MyItem
    Public Property SO As Object
    Public Property Customer As Object
    Public Property ShipBy As Object
End Class

' ...

Dim dataList As New List(Of MyItem)()

' ...

Dim item As New MyItem()
item.SO = DT.Rows(x).Item("SO")
item.Customer = DT.Rows(x).Item("Customer")
item.ShipBy = DT.Rows(x).Item("ShipBy")
dataList.Add(item)

' ...

Label1.Text = dataList(1).SO

或者,如果您坚持使用数组来存储每个项目,您可以列出一维数组,如下所示:

Dim dataList As New List(Of Object())()

' ...

dataList.Add(
    {
    DT.Rows(x).Item("SO"),
    DT.Rows(x).Item("Customer"),
    DT.Rows(x).Item("ShipBy")
    })

' ...

Label1.Text = dataList(1)(0)

答案 1 :(得分:1)

正如@Steven Doggart所说(并且在答案中打了我一分钟)你正在宣布一个阵列,但是你没有给出尺寸长度。您有两种选择:

  • 在声明
  • 处指定数组维度大小
  • 或使用Redim设置数组的(维度)大小

在您的情况下,一个解决方案可能如下所示:

Dim dataArray(,) As Array = New Array(3, DT.Rows.Count) {{}}

或者像这样:

Dim dataArray(,) As Array = New Array(,) {{}}
Redim dataArray(3, DT.Rows.Count)
Dim x As Integer
Dim DT As DataTable
Dim TA As New DSOldOrdersTableAdapters.TA
DT = getOldOrders()
For x = 0 To DT.Rows.Count - 1
    dataArray(0, x) = DT.Rows(x).Item("SO")
    dataArray(1, x) = (DT.Rows(x).Item("Customer"))
    dataArray(2, x) = (DT.Rows(x).Item("ShipBy"))
Next

看看这个MSDN Article - How to: Initialize an Array variable in VB.NET

答案 2 :(得分:1)

Dim dataArray(,) As Array = New Array(,) {{}}

这会创建一个Array的二维数组,即一个二维数组,其中每个元素都是Array。然后将其初始化为包含单个空Array元素的数组。我希望这不是你想要的。

由于您从未在代码中的任何位置ReDim更改其尺寸,因此它仍然是一个二维数组,其第一个维度为长度1,第二个维度为长度为零。

当您尝试运行

dataArray(0, x) = DT.Rows(x).Item("SO")

数组的第二维长度为零,因此无法保存值。因此,您会得到“索引超出范围”的异常。如果没有发生这种情况,您可能会得到另一个例外,因为DT.Rows(x).Item("SO")可能不是Array

将数据保留在DataTable中可能更容易,并在需要时从中读取数据。否则,我认为你的意图是做类似的事情:

Dim dataArray(0 To 3, -1) As Object  'Temporarily create a 2D Object array

'...load the DataTable

ReDim dataArray(0 to 3, 0 To DT.Rows.Count - 1)  'Redimension the array to the proper size.

'...rest of code