string.LastIndexOf()错误?

有谁知道为什么:

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

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

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

这是一个错误还是我误解LastIndexOf方法?

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

文档陈述如下:

search从一个指定的字符位置开始,然后朝向string的开头向后推进。

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

相反,如果使用仅包含子string的重载,则search将从string的末尾开始,因此正确地查找指示的子string。

LastIndexOfstring, int32重载说:“在这个实例中,报告指定的Unicode字符的最后一次出现的从零开始的索引位置。search从一个指定的字符位置开始,向后移动到串“

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

第二个参数不会做你认为它所做的事情:

 LastIndex(char value, int startIndex) 

startIndex是通过string向后search的字符,所以如果你传递一个0,那么只有第一个字符被检查…

要从最后检查整个string,您必须传递string-1的长度。

请参阅MSDN String.LastIndex

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

search从此实例的startIndex字符位置开始, 向后返回,直到find任何值或检查了第一个字符位置。 例如,如果startIndex是Length – 1,则该方法将从string的最后一个字符开始search每个字符。

(我的重点)

所以这:

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

从0开始并向后工作,因此正确地find没有结果并返回-1。

我认为令人困惑的是LastIndexOf倒数,其中IndexOf指向前进。

我想你是在误解这个方法。

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

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

试试这个代码:

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

希望它是有用的

这是因为第二个参数表示它应该从零开始并从那里开始朝向string的开头。

只有在string的开头才能findstring,并且只有在查找长度为一个字符的string的情况下:

 "<exception>".LastIndexOf("<",0) // returns 0 "<exception>".LastIndexOf("<ex",0) // returns -1 
  • haystack.LastIndexOf("needle")searchstring以查找最后发生的“needle”string。

  • LastIndexOfIndexOf方法返回-1如果search的值永远不会发生。

  • LastIndexOf< – 从右到左寻找,而

  • IndexOf 从左到右寻找– >

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

    • 当没有提供第二个参数时,两种方法都假设offset-index为0

  • 该函数也作为lastIndexOf在JavaScript中存在

    • (注意:mixedcase或camelBack-casing),并且设置一个超出haystring长度边界的索引在JavaScript中是OK的,但是在C#中会导致System.ArgumentOutOfRangeException: < 0 || > this.Length System.ArgumentOutOfRangeException: < 0 || > this.Lengthexception。

例如

 " <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 

由于在最后一种情况下,string或字符<在string0-1的字符间隔内存在, -1被正确地返回。

没关系,第一个expression式从string的第0个元素中find< symbol从开始,例如没有这样的simbol find; 第二个search整个string,find位置2和最后一个search等于0且返回0的位置。

msdn) 链接