誰もが理由を知っていますか:
" <exception>".LastIndexOf("<",0) returns -1 (wrong)
その間
" <exception>".LastIndexOf("<") returns 2 (right)
と
"<exception>".LastIndexOf("<",0) returns 0 (right)
これはバグですか、それともLastIndexOf-Methodを誤解していますか?
LastIndexOf
あなたはメソッドのその特定の過負荷を誤解しています。
ドキュメントには次のように記載されています。
検索は指定された文字位置から始まり、文字列の先頭に向かって逆方向に進みます。
と書かれていることに注意してくださいbackward
。したがって、位置から開始すると、その位置またはその位置の前に0
部分文字列がないため、結果はになります。"<"
-1
対照的に、部分文字列のみを取得するオーバーロードを使用する場合、検索は文字列の最後から開始されるため、指定された部分文字列が正しく検出されます。
のstring, int32
オーバーロードはLastIndexOf
、説明の中で、「このインスタンス内で最後に出現した指定されたUnicode文字のゼロベースのインデックス位置を報告します。検索は指定された文字位置から始まり、文字列の先頭に向かって逆方向に進みます。」
したがって、を渡すと0
、最初の文字のみがチェックされ、から の文字列全体はチェックされません0
。
2番目のパラメーターは、あなたが思っているようには機能しません。
LastIndex(char value, int startIndex)
startIndexは、文字列を逆方向に検索し始める文字です。したがって、0を渡すと、最初の文字のみがチェックされます。
文字列全体を最後からチェックするには、文字列の長さ-1を渡す必要があります。
MSDNString.LastIndexを参照してください
ドキュメント(http://msdn.microsoft.com/en-us/library/bc3z4t9d.aspx#Y0)は次のように述べています。
検索は、このインスタンスのstartIndex文字位置から始まり、値が見つかるか、最初の文字位置が調べられるまで、先頭に向かって逆方向に進みます。たとえば、startIndexがLength-1の場合、メソッドは文字列の最後の文字から先頭までのすべての文字を検索します。
(私の強調)
したがって、この:
" <exception>".LastIndexOf("<",0)
は0から始まり、逆方向に機能しているため、結果が正しく見つからず、-1が返されます。
混乱は、LastIndexOfが逆方向にカウントされ、IndexOfが順方向にカウントされることだと思います。
あなたはその方法を誤解していると思います。
2番目のパラメーターは、検索を開始する文字です。0の位置にある文字から逆方向に検索すると...結果は正しいです。
LastIndexOf **()**は指定された場所から逆方向に検索するため、これは間違いです。
このコードを試してください:
" <exception>".LastIndexOf("<", 5)
お役に立てば幸いです
これは、2番目のパラメーターが、位置0から開始し、そこから文字列の先頭に向かって見る必要があることを示しているためです。
文字列は、文字列の先頭にあり、1文字の長さの文字列を探している場合にのみ見つかります。
"<exception>".LastIndexOf("<",0) // returns 0
"<exception>".LastIndexOf("<ex",0) // returns -1
最初の式が<
文字列の0要素からシンボルを見つけて開始しても問題ありません。たとえば、そのような記号は見つかりません。2番目は文字列全体を検索して位置2を検索し、最後の1つは<に等しい0記号から検索して、0の位置を返します。
msdn)リンク
haystack.LastIndexOf("needle")
文字列を検索して、「針」文字列が最後に出現するかどうかを調べます。
検索する値が発生しない場合は、メソッドLastIndexOf
とをIndexOf
返します。-1
LastIndexOf
<-右から左にシークしますが、
IndexOf
左から右にシークします->
文字列の文字インデックスは、左から右に始まり、0
左から右に増加します。
0
どちらの方法も、2番目のパラメーターが指定されていない場合のオフセットインデックスを想定しています。
この関数はJavaScriptにも次のように存在しますlastIndexOf
System.ArgumentOutOfRangeException: < 0 || > this.Length
例外が発生します。例:
" <exception>".LastIndexOf("<", 3)
//> returns 2
" <exception>".LastIndexOf("<", " <exception>".Length)
//> returns 2
" <exception>".LastIndexOf("<", " <exception>".Length+1)
//> ArgumentOutOfRangeException
" <exception>".LastIndexOf("<", 2)
//> returns 2
" <exception>".LastIndexOf("<", -1)
//> returns -1
" <exception>".LastIndexOf("<", -2)
//> ArgumentOutOfRangeException
" <exception>".LastIndexOf("<", 1)
//> returns -1
最後のケース<
では、haystringの文字間隔の内に文字列または文字が存在しないため0-1
、 -1
が正しく返されます。