指数数组的边界之外

时间:2010-11-29 20:57:24

标签: vb.net arrays

在'如果aryTemp(1)< aryTemp2(1)然后

  

指数超出了界限   阵列。

出现

错误。无法确定为什么它会在数组范围之外。 基本上尝试比较姓氏以对记录进行排序并将其放回列表框中。

学生记录如下: 姓[空格]名字[空格]主要[空间]电话[空格]电子邮件[空格] GPA

示例:Johny Cake E201 6666666666 me@me.com 1.0

 Private Sub btnAscending_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAscending.Click
        ''#load all students into array
        Dim arySort(numberOfRecords) As String
        Dim aryTemp(6) As String
        Dim aryTemp2(6) As String
        For i = 0 To numberOfRecords - 1
            arySort(i) = lstListBox.Items(i)
        Next
        Dim temp As String ''#holds temporary record
        Dim k As Integer
        For i = 0 To arySort.Length - 2
            aryTemp = Split(arySort(i), " ")
            For k = i + 1 To arySort.Length - 1
                aryTemp2 = Split(arySort(k), " ")
                If aryTemp(1) < aryTemp2(1) Then ''# index of 1 refers to last name of a split string
                    temp = arySort(k)
                    arySort(k) = arySort(i)
                    arySort(i) = temp
                End If
            Next
        Next
        lstListBox.Items.Clear()
        numberOfRecords = 0
        isLoaded = False
        For i = 0 To arySort.Length - 1
            lstListBox.Items.Add(arySort(i))
            numberOfRecords += 1
        Next
        currentRecord = 0
        isLoaded = True
    End Sub

4 个答案:

答案 0 :(得分:2)

VB.NET中的数组是从零开始的,因此您的代码为每个数组声明了太多项。如上所述,arySort将为ListBox中的每个记录包含一个项目, plus 一个额外的空项目。这将导致你的一个aryTemp2 = Split(arySort(k),“”)调用分裂为Nothing,这将使你在aryTemp2数组中没有任何足够的项目与aryTemp进行比较。

更正后的代码:

Dim arySort(numberOfRecords - 1) As String
Dim aryTemp(5) As String
Dim aryTemp2(5) As String

答案 1 :(得分:0)

这是因为您要与aryTemp2中的第二项(索引1中的项目)进行比较,但aryTemp2包含1或0个元素。看起来你期望Split(arySort(k), " ")返回一个包含比实际更多元素的数组。您应该在比较之前检查数组的维度,或者验证arySort(k)是否包含至少一个空格(以确保arySort2中至少包含两个元素)。

答案 2 :(得分:0)

尝试If aryTemp(aryTemp.Length - 1) < aryTemp2(aryTemp2.Length - 1) Then,但确实遵循了姓氏不能有空格的假设。如果不是这种情况,则可以更多地构建代码以处理这种情况。

答案 3 :(得分:0)

如果您使用的是Visual Studio 2008或更高版本,则可以使此更多更简单:

Private Sub btnAscending_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAscending.Click
    Dim arySort = lstListBox.Items.OrderBy(Function(s) s.Split(" "c)(1)).ToArray()
    lstListBox.Clear()
    lstListBox.AddRange(arySort)
    currentRecord = 0
    isLoaded = True
End Sub

我不建议将其转入,因为它超出了教授对此任务的期望。此外,它与您不检查的原始代码具有相同的问题,以确保字符串中确实存在要拆分的空间。但是把它想象成你应该拍摄的东西。