Question

Disons que j'ai deux chaînes: a et b. Pour comparer si a et be ont les mêmes valeurs lorsque la casse est ignorée, j'ai toujours utilisé:

// (Assume a and b have been verified not to be null)

if (a.ToLower() == b.ToLower())

Cependant, en utilisant Reflector, je l'ai déjà vu plusieurs fois dans le .NET Framework:

// (arg three is ignoreCase)

if (string.Compare(a, b, true) == 0)

J'ai testé le plus rapide et le ToLower() battement Compare() à chaque fois avec les chaînes que j'ai utilisées.

Y a-t-il une raison pour laquelle CultureInfo au lieu de <=>? Quelque chose à propos de différent <=>? Je me gratte la tête.

Était-ce utile?

La solution

La section Remarques du article MSDN devrait expliquer certaines choses. La raison en est essentiellement la compatibilité entre différents contextes de culture.

Autres conseils

La principale chose qui devrait vous préoccuper n'est pas la performance, mais bien la correction. De ce point de vue, la méthode que vous voudriez probablement utiliser pour une comparaison insensible à la casse est:

string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0;

ou

a.Equals(b, StringComparison.OrdinalIgnoreCase)

(Le premier est utile si vous savez que les chaînes peuvent être nulles; le dernier est plus simple à écrire si vous savez déjà qu'au moins une chaîne est non nulle. Je n'ai jamais testé la performance, mais je suppose que ce sera le cas. similaire.)

Ordinal ou OrdinalIgnoreCase sont une valeur sûre, à moins que vous ne souhaitiez utiliser une autre méthode de comparaison; pour obtenir les informations nécessaires à la prise de décision, lisez cet article sur MSDN .

Lorsque vous comparez des chaînes, vous devez toujours utiliser un membre StringComparison explicite. Les fonctions de chaîne sont quelque peu incohérentes dans la manière dont elles choisissent de comparer des chaînes. Le seul moyen de garantir la comparaison utilisée est a) de les mémoriser (cela inclut vous et tous les membres de votre équipe) ou b) d’utiliser une comparaison explicite pour chaque fonction.

Il est préférable d’être explicite et de ne pas compter sur la connaissance parfaite du groupe. Vos coéquipiers vous en remercieront.

Exemple:

if ( StringComparison.OrdinalIgnoreCase.Equals(a,b) )

L’utilisation de ToLower à des fins de comparaison pose deux problèmes auxquels je peux penser immédiatement -

  1. Il alloue de la mémoire. Les fonctions de comparaison ne doivent pas allouer de mémoire sauf obligation absolue.
  2. Les chaînes peuvent être réduites de plusieurs manières. Le plus notable Ordinal ou Culture Sensitive inférieur. De quelle manière fonctionne .ToLower ()? Personnellement, je ne sais pas. Il est bien préférable de transmettre une culture explicite que de s’appuyer sur la valeur par défaut.

Un autre article MSDN qui fournit des instructions à ne pas faire et des recommandations concernant la méthode de comparaison à utiliser dans différents cas: Nouvelles recommandations pour l'utilisation de chaînes dans Microsoft .NET 2.0

ToLower () n'est pas une fonction de comparaison, il place la chaîne en minuscule. Lorsque l'opérateur == est utilisé sur des objets String en C #, il est optimisé par le compilateur. Au cœur de la structure, les deux dépendent de System.String.Equals, comme indiqué dans Reflector.

Votre message dans votre test indiquant que l'appel de ToLower () est plus rapide qu'une comparaison insensible à la casse? Mes tests montrent le contraire pour être vrai! Quoi qu’il en soit, les remarques des autres affiches sur la rectitude sont valables.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top