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?
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.
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
.
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.
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.
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
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.
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
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
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
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é.