string.LastIndexOf()Bug?

时间:2012-09-14 08:57:33

标签: c# string indexof

有谁知道原因:

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

,而

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

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

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

9 个答案:

答案 0 :(得分:76)

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

docs说明以下内容:

  

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

请注意,它显示为backward。因此,如果您从位置0开始,那个位置没有"<"子字符串,前面的那个位置,因此结果为-1。< / p>

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

答案 1 :(得分:22)

string, int32的{​​{1}}重载,in the description,“报告此实例中最后一次出现的指定Unicode字符的从零开始的索引位置。搜索从指定字符位置并向向后朝字符串开始。“

因此,如果您传入LastIndexOf,它将仅检查第一个字符,而不是检查 0中的整个字符串

答案 2 :(得分:10)

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

LastIndex(char value, int startIndex)

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

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

请参阅MSDN String.LastIndex

答案 3 :(得分:9)

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

  

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

(我的重点)

所以这个:

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

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

我认为混淆是LastIndexOf向后计数,而IndexOf向前计数。

答案 4 :(得分:4)

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

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

答案 5 :(得分:4)

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

试试这段代码:

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

希望它有用

答案 6 :(得分:3)

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

如果字符串位于字符串的开头,您只能找到该字符串,并且只有在您查找长度为一个字符的字符串时才会找到该字符串:

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

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

答案 7 :(得分:2)

没关系 第一个表达式从字符串的0元素中找到<符号以开始e。 G。没有这样的辛博尔找到; 第二个搜索整个字符串并找到位置2 并且最后一个从0 simbol搜索等于&lt;并返回0位置。

msdn)link

答案 8 :(得分:2)

  • haystack.LastIndexOf("needle")在字符串中搜索“needle”-string的最后一次出现。

  • 如果要搜索的值永不发生,方法LastIndexOfIndexOf将返回-1

  • LastIndexOf&lt; - 从右到左寻求,而

  • IndexOf从左到右寻找 - &gt;

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

    • 当没有提供第二个参数时,两种方法都假设偏移索引为0

  • 该功能也存在于JavaScript lastIndexOf

    • (注意:mixcase或camelBack-casing)并且在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

由于在最后一种情况下,在<的haystring的字符间隔内不存在字符串或字符0-1,因此正确返回-1