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。
LastIndexOf
的string, 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。 -
LastIndexOf
和IndexOf
方法返回-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.Length
exception。
- (注意:mixedcase或camelBack-casing),并且设置一个超出haystring长度边界的索引在JavaScript中是OK的,但是在C#中会导致
例如 :
" <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) 链接