web-dev-qa-db-fra.com

string.lastindexof () bug?

quelqu'un sait-il pourquoi:

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

tandis que

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

et

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

Est-ce un bogue ou suis-je mal compris la méthode suivante?

41
Florian Gl

Vous êtes mal compris que la surcharge particulière de la méthode LastIndexOf.

Le Docs State ce qui suit:

La recherche commence à une position de caractère spécifiée et recule vers le début de la chaîne.

Notez qu'il dit backward. Donc, si vous commencez à la position 0, il n'y a pas "<" Sous-chaîne à cette position ou devant cette position et donc le résultat est -1.

En revanche, si vous utilisez la surcharge qui ne prend que la sous-chaîne, la recherche commencera à la fin de la chaîne et de trouver correctement la sous-chaîne indiquée.

76
O. R. Mapper

Les string, int32 surcharge de LastIndexOf dit, dans la description , "rapporte la position d'index basée sur zéro de la dernière occurrence d'un caractère Unicode spécifié dans cette instance. La recherche commence à un Position et procédés de caractères vers l'arrière vers le début de la chaîne. "

Ainsi si vous passez dans 0, ce sera Vérifiez uniquement le premier caractère, ne pas vérifier l'ensemble de la chaîne à partir de0.

22
Rawling

Le deuxième paramètre ne fait pas ce que vous semblez penser qu'il fait:

LastIndex(char value, int startIndex)

le Startindex est le caractère de recherche de la recherche vers l'arrière via la chaîne, donc si vous passez un 0, seul le premier caractère est vérifié ...

Pour vérifier la chaîne entière de la fin, vous devriez passer la longueur de la chaîne -1.

voir msdn string.lastindex

11
Daniel

Les docs ( http://msdn.microsoft.com/en-us/library/bc3z4t9d.aspx#y ) Dites:

La recherche commence à la position de caractère startindex de cette instance et recule vers le début jusqu'à ce que l'une ou l'autre de la position de caractère a été examinée. Par exemple, si Startindex est de longueur - 1, la méthode effectue la recherche de chaque caractère du dernier caractère de la chaîne au début.

(Mon emphase)

Donc ça:

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

commence à 0 et travaille en arrière et ne trouve donc pas correctement aucun résultat et retour -1.

Je pense que la confusion est que LasIndexof compte à l'envers, où Indexof compte.

9
Jude Fisher

C'est une erreur, car LastIndexof ** () ** Cherchez vers l'arrière de l'emplacement spécifié.

Essayez ce code:

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

J'espère que c'est utile

4
user1659793

Je pense que vous manquez la méthode.

Le deuxième paramètre est le caractère où vous commencez à rechercher. Si vous effectuez une recherche en arrière du personnage dans la position 0 ... Les résultats ont raison.

4
Jonathan

C'est parce que le deuxième paramètre dit qu'il devrait commencer à positionner zéro et regarder de là et vers le début de la chaîne.

Vous ne trouverez que la chaîne si elle est au début de la chaîne, et seulement si vous recherchez une chaîne un caractère long:

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

"<exception>".LastIndexOf("<ex",0) // returns -1
3
Guffa

C'est ok la première expression trouve le < Symbole de l'élément 0 de la chaîne pour commencer e. g. Aucun tel SIMBOL recherche; La seconde recherche dans l'ensemble de la chaîne et trouvez en position 2 et une dernière recherche de 0 SIMBOL qui correspond à <et renvoyez la position 0.

mSDN) Link

2
KittenLS
  • haystack.LastIndexOf("needle") recherche une chaîne pour la dernière occurrence d'une "aiguille".

  • La méthode LastIndexOf et IndexOf renvoie -1 Si la valeur de la recherche ne se produit jamais.

  • LastIndexOf recherche de <- à droite à gauche, alors que

  • IndexOf recherche de gauche à droite ->

    • Les indices de caractères de la chaîne commencent à 0 et incrément de gauche à droite

    • Les deux méthodes supposent un indice de compensation de 0 Quand aucun deuxième paramètre n'est fourni

  • La fonction existe également dans JavaScript comme lastIndexOf

    • (Remarque: le boîtier mixte ou camelback) et que définir un index en dehors des limites de la longueur de HAYSTRING est OK dans JavaScript, mais en C #, il entraînera une System.ArgumentOutOfRangeException: < 0 || > this.Length Exception.

Exemples :

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

Depuis dans le dernier cas, aucune chaîne ou caractère < existe dans l'intervalle de caractère de Haystring de 0-1, -1 est correctement retourné.

2
Lorenz Lo Sauer