有谁知道为什么:
" <exception>".LastIndexOf("<",0) returns -1 (wrong)
尽管
" <exception>".LastIndexOf("<") returns 2 (right)
和
"<exception>".LastIndexOf("<",0) returns 0 (right)
这是一个错误还是我误解了 LastIndexOf-Method?
您误解了该LastIndexOf
方法的特定重载。
文档说明以下内容:
搜索从指定的字符位置开始,然后向后向字符串的开头进行。
请注意,它说backward
. 因此,如果您从 position 开始,则该位置或该位置前面0
没有子字符串,因此结果为。"<"
-1
相反,如果您使用仅采用子字符串的重载,则搜索将从字符串的末尾开始,从而正确找到指示的子字符串。
的string, int32
重载在描述LastIndexOf
中说,“报告此实例中指定的 Unicode 字符最后一次出现的从零开始的索引位置。搜索从指定的字符位置开始,并向后进行到字符串的开头。”
因此,如果您传入0
,它只会检查第一个字符,而不是检查整个字符串。 0
第二个参数并没有像您认为的那样做:
LastIndex(char value, int startIndex)
startIndex 是开始向后搜索字符串的字符,因此如果您传递 0 则仅检查第一个字符...
要从末尾检查整个字符串,您必须传递字符串的长度 -1。
文档(http://msdn.microsoft.com/en-us/library/bc3z4t9d.aspx#Y0)说:
搜索从该实例的 startIndex 字符位置开始,然后向开头向后进行,直到找到值或检查了第一个字符位置。例如,如果 startIndex 为 Length - 1,则该方法搜索从字符串中的最后一个字符到开头的每个字符。
(我的重点)
所以这:
" <exception>".LastIndexOf("<",0)
从 0 开始并向后工作,因此正确地找不到结果并返回 -1。
我认为令人困惑的是 LastIndexOf 向后计数,而 IndexOf 向前计数。
这是一个错误,因为 LastIndexOf ** () ** 从指定位置向后搜索。
试试这个代码:
" <exception>".LastIndexOf("<", 5)
希望有用
我认为你误解了这个方法。
第二个参数是您开始搜索的字符。如果从 0 位置的字符向后搜索...结果是正确的。
那是因为第二个参数说它应该从位置零开始,然后从那里向字符串的开头看。
如果它位于字符串的开头,并且仅当您正在查找一个字符长的字符串时,您只会找到该字符串:
"<exception>".LastIndexOf("<",0) // returns 0
"<exception>".LastIndexOf("<ex",0) // returns -1
没关系,第一个表达式<
从字符串的 0 元素开始找到符号,例如没有找到这样的符号;第二个搜索整个字符串并在位置 2 中找到,最后一个从等于 < 的 0 simbol 搜索并返回 0 位置。
msdn)链接
haystack.LastIndexOf("needle")
在字符串中搜索最后一次出现的“needle”-字符串。
如果要搜索的值从未出现,则返回该方法LastIndexOf
和IndexOf
返回值。-1
LastIndexOf
从<--right-to-left寻找,而
IndexOf
从左到右寻找-->
字符串的字符索引0
从左到右开始并递增
两种方法都假定0
没有提供第二个参数时的偏移索引
该函数也存在于JavaScript中lastIndexOf
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
因此正确返回。