lastindexofany example c# string indexof

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.

ver MSDN String.LastIndex


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 e IndexOf devuelve -1 si el valor para buscar nunca ocurre.

  • LastIndexOf busca de <- de derecha a izquierda , mientras que

  • IndexOf busca de izquierda a derecha ->

    • Los índices de caracteres de la cadena comienzan en 0 e incrementan de izquierda a derecha

    • Ambos 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.

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.