web-dev-qa-db-ja.com

string.LastIndexOf()バグ?

誰かが理由を知っていますか:

"  <exception>".LastIndexOf("<",0) returns -1 (wrong)

ながら

"  <exception>".LastIndexOf("<") returns 2 (right)

そして

"<exception>".LastIndexOf("<",0) returns 0 (right)

これはバグですか、それともLastIndexOf-Methodを誤解していますか?

41
Florian Gl

LastIndexOfメソッドの特定のオーバーロードを誤解しています。

docs は次のように述べています。

検索は指定された文字位置から始まり、文字列の先頭に向かって後方に進みます。

backwardと表示されていることに注意してください。したがって、位置0、ありません"<"その位置の部分文字列、またはその位置の前で、結果は-1

対照的に、部分文字列のみを受け取るオーバーロードを使用する場合、検索は文字列の末尾から開始されるため、指定された部分文字列を正しく検索します。

76
O. R. Mapper

string, int32オーバーロードLastIndexOfは次のように述べます 説明内 、 "このインスタンス内の指定されたUnicode文字の最後の出現のゼロベースのインデックス位置を報告します。検索は指定された場所から始まります文字位置と文字列の先頭に向かって逆方向に進みます。 "

したがって、0、それは最初の文字のみをチェックします、文字列全体をチェックしませんfrom0

22
Rawling

2番目のパラメーターは、あなたが考えているようには見えません。

LastIndex(char value, int startIndex)

startIndexは、文字列全体の検索backwardsを開始する文字であるため、0を渡すと、最初の文字のみがチェックされます...

文字列全体を最後から確認するには、文字列の長さに-1を渡す必要があります。

参照 MSDN String.LastIndex

11
Daniel

ドキュメント( http://msdn.Microsoft.com/en-us/library/bc3z4t9d.aspx#Y )はこう言います:

検索は、このインスタンスのstartIndex文字位置から始まり、値が見つかるか、最初の文字位置が調べられるまで、先頭に向かって逆方向に進みます。たとえば、startIndexがLength-1の場合、メソッドは文字列の最後の文字から先頭までのすべての文字を検索します。

(私の強調)

したがって、この:

"  <exception>".LastIndexOf("<",0)

は0から始まり、逆方向に動作しているため、結果を正しく検出せず、-1を返します。

混乱は、LastIndexOfが逆方向にカウントされ、IndexOfが順方向にカウントされることです。

9
Jude Fisher

LastIndexOf **()**は指定された場所から逆方向に検索するため、これは誤りです。

このコードを試してください:

"  <exception>".LastIndexOf("<", 5)

お役に立てれば幸いです

4
user1659793

方法を誤解していると思います。

2番目のパラメーターは、検索を開始する文字です。 0の位置の文字から後方検索すると、結果は正しいです。

4
Jonathan

それは、2番目のパラメーターがゼロの位置から始まり、そこから文字列の先頭に向かって見る必要があることを示しているためです。

文字列の先頭にある場合、および1文字の長さの文字列を探している場合にのみ、文字列を検索します。

"<exception>".LastIndexOf("<",0)  // returns 0

"<exception>".LastIndexOf("<ex",0) // returns -1
3
Guffa

最初の式が文字列の0要素から<記号を見つけてeを開始するのは問題ありません。 g。そのようなシンボルは見つかりません。 2番目は文字列全体を検索して位置2を見つけ、最後の1つは<に等しい0シンボルから検索して0位置を返します。

msdn) リンク

2
KittenLS
  • haystack.LastIndexOf("needle")は、「needle」文字列が最後に出現する文字列を検索します。

  • メソッドLastIndexOfおよびIndexOfは、検索する値が決して発生しない場合、-1を返します。

  • LastIndexOf<-right-to-leftからシークしますが、

  • IndexOf左から右にシークします->

    • 文字列の文字インデックスは0で始まり、左から右に増加します

    • 2番目のパラメーターが指定されていない場合、どちらのメソッドも0のオフセットインデックスを想定します

  • この関数は JavaScript にもlastIndexOfとして存在します

    • (注:大文字と小文字の混合またはキャメルバックケース)、ヘイストリングの長さの範囲外のインデックスの設定はJavaScriptでは問題ありませんが、C#では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

最後のケースでは、<の干し草の文字間隔内に文字列または文字0-1が存在しないため、-1が正しく返されます。

2
Lorenz Lo Sauer