Вы можете создать рекурсивную функцию с помощью IndexOf. Передавая строку для поиска и строку, которую нужно найти, каждая рекурсия увеличивает счетчик и устанавливает значение StartIndex равным +1 последнему найденному индексу, пока строка поиска больше не будет найдена. Функция потребует дополнительных параметров. Начальная позиция и счетчик передаются по ссылке:
Function InStrCount(ByVal SourceString As String, _
ByVal SearchString As String, _
Optional ByRef StartPos As Integer = 0, _
Optional ByRef Count As Integer = 0) As Integer
If SourceString.IndexOf(SearchString, StartPos) > -1 Then
Count += 1
InStrCount(SourceString, _
SearchString, _
SourceString.IndexOf(SearchString, StartPos) + 1, _
Count)
End If
Return Count
End Function
Функция вызова, передавая строку для поиска и строку для поиска и, необязательно, начальную позицию:
Dim input As String = "Hello there. My name is John. I work very hard. Hello there!"
Dim phrase As String = "hello there"
Dim Occurrences As Integer
Occurrances = InStrCount(input.ToLower, phrase.ToLower)
Обратите внимание на использование .ToLower, которое используется для игнорирования случая при сравнении. Не включайте эту директиву, если вы хотите, чтобы сравнение было конкретным.
u = User.first
u.tickets.size # 12
u2 = u.clone
u2.tickets = u.tickets
u2.tickets.pop
u2.tickets.size # 11
u.tickets.size # 12
Итак, u и u2 теперь имеют разные массивы билетов