string.LastIndexOf()Bug?

Flo*_* Gl 41 c# string indexof

有谁知道原因:

"  <exception>".LastIndexOf("<",0) returns -1 (wrong)
Run Code Online (Sandbox Code Playgroud)

"  <exception>".LastIndexOf("<") returns 2 (right)
Run Code Online (Sandbox Code Playgroud)

"<exception>".LastIndexOf("<",0) returns 0 (right)
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是我误解了LastIndexOf-Method?

O. *_*per 76

您误解了该LastIndexOf方法的特定重载.

文档说明如下:

搜索从指定的字符位置开始,然后向后朝向字符串的开头.

请注意,它说backward.因此,如果从位置开始,那个位置或该位置前面0没有"<"子串,因此结果是.-1

相反,如果使用仅占用子字符串的重载,则搜索将从字符串的末尾开始,从而正确地找到指示的子字符串.

  • 好的,现在有了upvotes,这很容易成为我迄今为止所写的最被高估的答案.如果你想提出一个答案,请提出答案,其作者已经考虑了解决方案并解释了这些想法,而不是仅仅复制了文档. (4认同)
  • 好的,非常感谢你.我只是阅读intellisense菜单中的描述,所以我不知道它向后进展.;) (2认同)
  • 在我看来,一个更有趣的问题是为什么那些人选择以这种方式实现它。 (2认同)
  • @ antony.trupe:如果你考虑一下,它是唯一*明智的*方式.如果函数的目的是获取字符串的*last*出现的索引,那么提供一个起始索引以向前工作将是没有意义的. (2认同)

Raw*_*ing 22

string, int32过载LastIndexOf说,在描述中,"报告此实例中指定的Unicode字符最后一次出现的从零开始的索引位置,搜索从指定字符位置开始并继续向后朝字符串的开始."

因此,如果你传递0,它将只检查的第一个字符,而不是检查整个字符串 0.


Dan*_*iel 10

第二个参数不会像您认为的那样做:

LastIndex(char value, int startIndex)
Run Code Online (Sandbox Code Playgroud)

startIndex是开始向后搜索字符串的char ,所以如果你传递一个0,那么只检查第一个char ...

要从末尾检查整个字符串,您必须传递字符串-1的长度.

请参阅MSDN String.LastIndex


Jud*_*her 9

文档(http://msdn.microsoft.com/en-us/library/bc3z4t9d.aspx#Y0)说:

搜索从此实例的startIndex字符位置开始,然后向后开始,直到找到任一值或检查了第一个字符位置.例如,如果startIndex是Length - 1,则该方法将搜索字符串中最后一个字符的每个字符到开头.

(我的重点)

所以这:

"  <exception>".LastIndexOf("<",0)
Run Code Online (Sandbox Code Playgroud)

从0开始并向后工作,因此正确地找不到结果并返回-1.

我认为混淆是LastIndexOf向后计数,其中IndexOf向前计数.