43

有谁知道为什么:

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

尽管

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

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

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

4

9 回答 9

78

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

文档说明以下内容:

搜索从指定的字符位置开始,然后向后向字符串的开头进行。

请注意,它说backward. 因此,如果您从 position 开始,则该位置或该位置前面0没有子字符串,因此结果为。"<"-1

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

于 2012-09-14T09:02:03.983 回答
22

string, int32重载在描述LastIndexOf中说,“报告此实例中指定的 Unicode 字符最后一次出现的从零开始的索引位置。搜索从指定的字符位置开始,并向后进行到字符串的开头。”

因此,如果您传入0,它只会检查第一个字符,而不是检查整个字符串 0

于 2012-09-14T09:01:34.817 回答
11

第二个参数并没有像您认为的那样做:

LastIndex(char value, int startIndex)

startIndex 是开始向后搜索字符串的字符,因此如果您传递 0 则仅检查第一个字符...

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

MSDN String.LastIndex

于 2012-09-14T09:05:03.170 回答
9

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

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

(我的重点)

所以这:

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

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

我认为令人困惑的是 LastIndexOf 向后计数,而 IndexOf 向前计数。

于 2012-09-14T09:07:33.730 回答
4

这是一个错误,因为 LastIndexOf ** () ** 从指定位置向后搜索。

试试这个代码:

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

希望有用

于 2012-09-14T09:15:13.007 回答
4

我认为你误解了这个方法。

第二个参数是您开始搜索的字符。如果从 0 位置的字符向后搜索...结果是正确的。

于 2012-09-14T09:02:48.090 回答
3

那是因为第二个参数说它应该从位置零开始,然后从那里向字符串的开头看。

如果它位于字符串的开头,并且仅当您正在查找一个字符长的字符串时,您只会找到该字符串:

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

"<exception>".LastIndexOf("<ex",0) // returns -1
于 2012-09-14T09:02:23.170 回答
2

没关系,第一个表达式<从字符串的 0 元素开始找到符号,例如没有找到这样的符号;第二个搜索整个字符串并在位置 2 中找到,最后一个从等于 < 的 0 simbol 搜索并返回 0 位置。

msdn)链接

于 2012-09-14T09:06:22.920 回答
2
  • haystack.LastIndexOf("needle")在字符串中搜索最后一次出现的“needle”-字符串。

  • 如果要搜索的值从未出现,则返回该方法LastIndexOfIndexOf返回值。-1

  • LastIndexOf<--right-to-left寻找,而

  • IndexOf从左到右寻找-->

    • 字符串的字符索引0从左到右开始并递增

    • 两种方法都假定0没有提供第二个参数时的偏移索引

  • 该函数也存在于JavaScriptlastIndexOf

    • (注意:混合大小写或驼峰大小写)并且在 JavaScript 中设置超出 haystring 长度范围的索引是可以的,但在 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因此正确返回。

于 2012-09-23T18:49:56.053 回答