Что я делаю не так?
Вы находите второе a
. Я предполагаю, что вы думали об этом:
checkme.IndexOf("a", checkme.IndexOf("a", 3))
, что на самом деле даст вам правильный результат. (Там написано: «Найдите первое a, которое встречается после первого a, которое встречается на 3-м символе или после него (это a)»)
Ваш оригинальный код гласил: «Найдите первый a, который появляется на или после 3 позиций после первого a», что приводит вас только ко второму a
.
Как это исправить?
Вы можете просто использовать IndexOf
в цикле, повторно используя последний найденный индекс в качестве следующего начального индекса.
Shared Public Function FindIndexOfNthChar(ByVal checkme as String, _
ByVal checkChar as Char, _
ByVal n as Integer) as Integer
Dim lastIndex As Integer = -1
For i As Integer = 1 To n
lastIndex = checkme.IndexOf(checkChar, lastIndex + 1)
If lastIndex = -1 Then Return -1
Next i
Return lastIndex
End Function
Вы должны быть осторожны; если вы не проверяете -1
при каждой попытке и сразу же завершаете работу, вы можете получить неверные результаты.
Если вы забыли об этом (как некоторые другие сообщения, похоже, имеют), то, если вы будете искать третий a
в строке с одним a
, вы фактически вернете индекс первого a
(Когда вы попытаетесь найти второй a, вы сбросите свой индекс на -1
, что, по сути, начнет поиск заново)
По этой причине может быть понятнее просто написать именно то, что вы имеете в виду:
Shared Public Function FindIndexOfNthChar(ByVal checkme as String, _
ByVal checkChar as Char, _
ByVal n as Integer) as Integer
Dim count as Integer = 0
For i as Integer = 0 To checkme.Length - 1
If(checkme(i) = checkChar) Then
count += 1
If(count = n) Then Return i
End If
Next i
return -1
End Function