オンボードの方法はなく、実際には単純ではありません。 1つのアプローチは、すべての文字を繰り返し、それが空間かどうかを調べることです。あなたが1つを見つけた場合は、連続するスペースがある可能性があるため、単語の先頭を見つける必要があります。そのインデックスを取得したら、次のスペースを探す必要があります。なぜなら、単語の終わりです。この単語があなたが探している単語に等しい場合、あなたはインデックスを持っています。
すべての一致インデックスまたは最後のインデックスを検索するなど、再利用できるメソッドを作成することは非常に難しいためです。したがって、イテレータはVB.NETにも存在します。彼らは物事をゆっくりと返すことができるので、あなたがそれらを求める場合に限ります。あなたが最初のを頼む場合の方法は、すぐに最初に戻されたように壊れます:ここで
Public Shared Iterator Function GetIndexesOfWord(input As String, wordToFind As String, Optional comparer As StringComparer = Nothing, Optional wordSeparator As Char = " "c) As IEnumerable(Of Int32)
If comparer Is Nothing Then comparer = StringComparer.Ordinal
For index As Int32 = 0 To input.Length - 1
If index = 0 OrElse input(index) = wordSeparator Then
Dim token = input.Substring(index)
Dim trimmed = token.TrimStart(wordSeparator)
index = index + (token.Length - trimmed.Length) ' start of word
Dim endIndex = input.IndexOf(wordSeparator, index)
If endIndex = -1 Then endIndex = input.Length
Dim length = endIndex - index
Dim word = input.Substring(index, length)
If comparer.Equals(word, wordToFind) Then
Yield index
End If
index = endIndex - 1 ' -1 because the for-loop will jump over the space otherwise
End If
Next
End Function
は例です:
Dim sentence = "this is just sample text that contains a text sample"
Dim word = "sample"
Dim indexes = GetIndexesOfWord(sentence, word)
あなただけの最初のインデックスしたい場合:
Dim firstIndex As Int32 = indexes.First()
を
すべてが必要な場合は、コレクションを記入することができます。たとえば、
Dim indexList As List(Of Int32) = indexes.ToList()
リストを使用する場合は、lict.Count > 0
を確認して、単語が文章内にあったかどうかを知ることができます。 First
、Last
、または1つのインデックスを返す他のメソッドを使用する場合は、InvalidOperationException
になる可能性があります。この場合、のデフォルト値はInt32
が有効なインデックスである0なので役に立ちません。だから、試合があったかどうかを判断するために、このアプローチを使用することができ、1つは最初のインデックスを取得していた場合:
Dim firstIndex As Int32 = indexes.DefaultIfEmpty(-1).First()
は今、あなたは、単語がその文ではなかったことを意味することに-1を知っています。
あなたは、Visual Studio 2010を使用しているので、あなたはどのイテレータとVB.NETでYield
-statement遅延実行を使用することはできません。最初に見つかったインデックスは、最初に必要な場合に効率的です。または、すべてのインデックスを含むリストを塗りつぶすこのメソッドを使用します。
Public Shared Function GetIndexesOfWord(input As String, wordToFind As String, Optional comparer As StringComparer = Nothing, Optional wordSeparator As Char = " "c) As IEnumerable(Of Int32)
If comparer Is Nothing Then comparer = StringComparer.Ordinal
Dim allIndexes = new List(Of Int32)
For index As Int32 = 0 To input.Length - 1
If index = 0 OrElse input(index) = wordSeparator Then
Dim token = input.Substring(index)
Dim trimmed = token.TrimStart(wordSeparator)
index = index + (token.Length - trimmed.Length) ' start of word
Dim endIndex = input.IndexOf(wordSeparator, index)
If endIndex = -1 Then endIndex = input.Length
Dim length = endIndex - index
Dim word = input.Substring(index, length)
If comparer.Equals(word, wordToFind) Then
allIndexes.Add(index)
End If
index = endIndex - 1 ' -1 because the for-loop will jump over the space otherwise
End If
Next
return allIndexes
End Function
単語とは何ですか?区切り文字で区切られた部分文字列や単語を探していますか(空白や句読点など)? –
単語をスペースで区切って@TimSchmelter –
単語の位置や文字の位置をお探しですか?すなわち「クイックブラウンキツネ」、「ブラウン」は2(ゼロベース)または10? – djv