2017-01-18 1 views
0

Я использую этот код для поиска массива строк для спичек с входом, однако я получаю следующее сообщение об ошибке:Ошибки при использовании цикла для поиска строки массив

An unhandled exception of type 'System.IndexOutOfRangeException' occurred in task on page 110.exe

Вот код:

Public Class Form1 
    Dim letters() As String = {"a", "a", "e", "g", "g", "g", "h", "g", "e", "k", "o", "k", "K", "g"} 
    Dim search As String 
    Dim numMatches As Integer = 0 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     search = TextBox1.Text 
     numMatches = 0 
     For i = 0 To 14 
      If search = letters(i) Then 
       numMatches = numMatches + 1 
      End If 
     Next 
     TextBox2.Text = numMatches 
    End Sub 
End Class 
+1

Используйте отладчик, чтобы увидеть, что значение I, когда вы получите сообщение об ошибке. Готов поспорить, вы обнаружите, что это значение равно 14, и это выходит за пределы вашего массива. –

+0

Это тривиальная вещь для отладки. Установите точку останова и удерживайте кнопку мыши над буквами – Plutonix

+3

Помните, что с массивами на основе 0 массив длиной n будет иметь максимальный индекс n-1. Таким образом, ваш цикл for должен быть от 0 до 13 или, еще лучше, 'letters.Length - 1'. Или просто используйте 'For Every' и забудьте об индексах, так как они вам не нужны. –

ответ

0

Я хотел бы представить ответ с помощью LINQ, который вы можете узнать больше о here.

numMatches = letters.Select(Function(x) x).Where(Function(x) x = search).Count() 

Надеюсь, что это помогает

0

Это немного Hacky, но она работает таким образом ..

Public Class Form1 

    Dim letterslist As New List(Of String) 
    Dim search As String 
    Dim numMatches As Integer 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     letterslist.Clear() 
     letterslist.Add("a") 
     letterslist.Add("a") 
     letterslist.Add("e") 
     letterslist.Add("g") 
     letterslist.Add("g") 
     letterslist.Add("g") 
     letterslist.Add("h") 
     letterslist.Add("g") 
     letterslist.Add("e") 
     letterslist.Add("k") 
     letterslist.Add("o") 
     letterslist.Add("k") 
     letterslist.Add("k") 
     letterslist.Add("g") 

     numMatches = 0 

     For Each item In letterslist 
      If item.Contains(TextBox1.Text) Then 
       numMatches += 1 
      End If 
     Next 

     TextBox2.Text = numMatches 

    End Sub 

End Class 
0

Вы пытаетесь найти значения, которые находятся вне границ массива.

Массивы в vb.net начинаются с 0. Так что в цикле for 0 -> 14 будет искать 15 элементов в массиве. Изменение цикла for к приведенному ниже коду должно исправить это.

For i = 0 To 13 
      If search = letters(i) Then 
       numMatches += 1 
      End If 
     Next 

Другой способ сделать это будет с a для каждого цикла.

For each value in letters 
     if search = value then 
      numMatches += 1 
     End If 
    Next 

A для каждого цикла будет работать, даже если вы решите изменить объем данных в массиве позже.

8)

Смежные вопросы