41 votes

string.LastIndexOf() Bug ?

Quelqu'un sait-il pourquoi ?

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

tandis que

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

y

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

Est-ce un bug ou est-ce que je comprends mal la méthode LastIndexOf ?

76voto

O. R. Mapper Points 9163

Vous comprenez mal cette surcharge particulière de la LastIndexOf méthode.

El docs déclare ce qui suit :

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

Notez qu'il est dit backward . Donc, si vous commencez à la position 0 il n'y a pas de "<" la 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 trouvera donc correctement la sous-chaîne indiquée.

22voto

Rawling Points 21932

El string, int32 surcharge de LastIndexOf dit, dans la description La recherche commence à la position du caractère spécifié et se poursuit jusqu'à la dernière occurrence du caractère. La recherche commence à la position du caractère spécifié et se poursuit à l'endroit suivant en arrière vers le début de la chaîne ."

Ainsi, si vous passez dans 0 il sera ne vérifie que le premier caractère ne pas vérifier la chaîne entière de 0 .

11voto

Daniel Points 136

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

LastIndex(char value, int startIndex)

startIndex est le caractère à rechercher. à l'envers à travers la chaîne, donc si vous passez un 0 alors seul le premier caractère est vérifié...

Pour vérifier la chaîne entière depuis la fin, il faudrait passer la longueur de la chaîne à -1.

voir MSDN String.LastIndex

9voto

JcFx Points 6266

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

La recherche commence à la position de caractère startIndex de cette instance et revient en arrière vers le début jusqu'à ce que la valeur soit trouvée, soit que la première position de caractère ait été examinée. Pour Par exemple, si startIndex est égal à Longueur - 1, la méthode recherche tous les caractère depuis le dernier caractère de la chaîne jusqu'au début.

(C'est moi qui souligne)

Alors ça :

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

commence à 0 et travaille à l'envers, et donc ne trouve pas de résultat et renvoie -1.

Je pense que la confusion vient du fait que LastIndexOf compte en arrière, alors que IndexOf compte en avant.

4voto

Jonathan Points 6611

Je pense que vous comprenez mal la méthode.

Le deuxième paramètre est le caractère où vous commencez la recherche. Si vous cherchez en arrière à partir du caractère en position 0... les résultats sont corrects.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X