example - lastindexof string c#
string.LastIndexOf() Bug? (9)
Creo que estás malinterpretando el método.
El segundo parámetro es el carácter donde comienzas a buscar. Si busca hacia atrás desde el carácter en la posición 0 ... los resultados son correctos.
Alguien sabe por qué:
" <exception>".LastIndexOf("<",0) returns -1 (wrong)
mientras
" <exception>".LastIndexOf("<") returns 2 (right)
y
"<exception>".LastIndexOf("<",0) returns 0 (right)
¿Esto es un error o estoy malinterpretando el método LastIndexOf?
El segundo parámetro no hace lo que parece pensar que hace:
LastIndex(char value, int startIndex)
startIndex es el char para iniciar la búsqueda hacia atrás a través de la cadena, por lo que si pasa un 0, solo se verifica el primer char ...
Para verificar toda la cadena desde el final, tendría que pasar la longitud de la cadena -1.
Es un error, porque LastIndexOf ** () ** busca hacia atrás desde la ubicación especificada.
Prueba este código:
" <exception>".LastIndexOf("<", 5)
Espero que sea util
Eso es porque el segundo parámetro dice que debería comenzar en la posición cero y mirar desde allí y hacia el principio de la cadena.
Solo encontraría la cadena si está al principio de la cadena, y solo si está buscando una cadena que tiene un carácter:
"<exception>".LastIndexOf("<",0) // returns 0
"<exception>".LastIndexOf("<ex",0) // returns -1
Está bien, la primera expresión encuentra el símbolo <
del elemento 0 de la cadena para comenzar, por ejemplo, no se encuentra tal símbolo; la segunda busca a través de toda la cadena y encuentra en la posición 2 y la última busca desde el símbolo 0 que es igual a <y devuelve la posición 0.
msdn) link
Está malinterpretando esa sobrecarga particular del método LastIndexOf
.
Los docs indican lo siguiente:
La búsqueda comienza en una posición de carácter específica y continúa hacia atrás hacia el principio de la cadena.
Tenga en cuenta que dice al backward
. Por lo tanto, si comienza en la posición 0
, no hay ninguna subcadena "<"
en esa posición o en frente de esa posición y, por lo tanto, el resultado es -1
.
Por el contrario, si usa la sobrecarga que toma solo la subcadena, la búsqueda comenzará al final de la cadena y, por lo tanto, encontrará correctamente la subcadena indicada.
La string, int32
sobrecarga string, int32
de LastIndexOf
dice, en la descripción , "Informa la posición del índice basado en cero de la última aparición de un carácter Unicode especificado dentro de esta instancia. La búsqueda comienza en una posición de carácter específica y continúa hacia atrás hacia el principio del cuerda ".
Por lo tanto, si pasa 0
, solo verificará el primer carácter , no verificará toda la cadena desde 0
.
Los documentos ( http://msdn.microsoft.com/en-us/library/bc3z4t9d.aspx#Y0 ) dicen:
La búsqueda comienza en la posición de carácter de inicio de índice de esta instancia y continúa hacia atrás hasta el comienzo hasta que se encuentra uno de los valores o se examina la primera posición de carácter. Por ejemplo, si startIndex es Longitud - 1, el método busca todos los caracteres desde el último carácter de la cadena hasta el principio.
(Mi énfasis)
Así que esto:
" <exception>".LastIndexOf("<",0)
está comenzando en 0 y trabajando hacia atrás, y por lo tanto, no encuentra correctamente ningún resultado y devuelve -1.
Creo que la confusión es que LastIndexOf cuenta hacia atrás, donde IndexOf cuenta hacia adelante.
haystack.LastIndexOf("needle")
busca una cadena para la última aparición de una cadena "needle".El método
LastIndexOf
eIndexOf
devuelve-1
si el valor para buscar nunca ocurre.LastIndexOf
busca de <- de derecha a izquierda , mientras queIndexOf
busca de izquierda a derecha ->Los índices de caracteres de la cadena comienzan en
0
e incrementan de izquierda a derechaAmbos métodos asumen un índice de desplazamiento de
0
cuando no se proporciona un segundo parámetro
La función también existe en JavaScript como
lastIndexOf
- (Nota: el mixcase o camelBack-casing) y que establecer un índice fuera de los límites de la longitud de la cadena de heno está bien en JavaScript, pero en C # resultará en una
System.ArgumentOutOfRangeException: < 0 || > this.Length
System.ArgumentOutOfRangeException: < 0 || > this.Length
Exception.
- (Nota: el mixcase o camelBack-casing) y que establecer un índice fuera de los límites de la longitud de la cadena de heno está bien en JavaScript, pero en C # resultará en una
Ejemplos :
" <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
Como en el último caso no existe una cadena o un carácter <
dentro del intervalo de caracteres de 0-1
de la cadena de hay, se devuelve -1
correctamente.