277 votes

Les différences dans la chaîne de comparer les méthodes en C#

La comparaison de chaîne de caractères en C# est assez simple. En fait, il ya plusieurs façons de le faire. J'ai répertorié quelques-uns dans le bloc ci-dessous. Ce que je suis curieux de savoir sont les différences entre eux et où l'on doit être utilisé sur les autres? Doit-on être évité à tout prix? Il n'y a plus je n'ai pas sur la liste?

string testString = "Test";
string anotherString = "Another";

if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}

(Note: je suis à la recherche de l'égalité dans cet exemple, pas moins ou plus mais n'hésitez pas à commenter cet)

236voto

Lasse V. Karlsen Points 148037

Voici les règles de la façon dont ces fonctions de travail:

stringValue.CompareTo(otherStringValue):

  1. null vient avant une chaîne de caractères
  2. il utilise CultureInfo.CurrentCulture.CompareInfo.Comparer, ce qui signifie qu'il va utiliser une culture dépendant de la comparaison. Cela pourrait signifier qu'ß permettra de comparer égale à la SS en Allemagne, ou similaire

stringValue.Equals(otherStringValue):

  1. nulle n'est pas considérée comme étant égale à rien
  2. sauf si vous spécifiez un StringComparison option, il va utiliser ce qui ressemble à un direct ordinale contrôle d'égalité, c'est à dire. ß n'est pas la même que la SS, dans n'importe quelle langue ou de la culture

stringValue == otherStringValue:

  1. N'est pas le même que stringValue.Equals().
  2. L'opérateur == appels statiques Equals(string a, string b) méthode (qui à son tour va à l'interne EqualsHelper de faire la comparaison.
  3. De l'appelant .Equals() sur une chaîne null obtient référence nulle exception, alors que sur == ne pas.

Objet.ReferenceEquals(stringValue, otherStringValue):

Vérifie juste que les références sont les mêmes, c'est à dire. il n'est pas juste deux chaînes avec le même contenu, vous êtes à la comparaison d'un objet de type string avec lui-même.


Notez qu'avec les options ci-dessus qui utilisent des appels de méthode, il y a des surcharges avec plus d'options pour spécifier comment les comparer.

Mon conseil si vous voulez juste pour vérifier l'égalité est de faire de votre esprit que vous voulez utiliser une culture dépendant de la comparaison ou pas, et ensuite utiliser .CompareTo ou .D'égal à égal, selon le choix.

74voto

Ed S. Points 70246

À partir de MSDN:

"La méthode CompareTo a été conçu principalement pour une utilisation dans les opérations de tri ou de le classement en ordre alphabétique des opérations. Il ne doit pas être utilisé lors de la primaire le but de l'appel de la méthode est de déterminer si deux chaînes sont l'équivalent. Pour déterminer si deux chaînes sont équivalentes, appel la méthode Equals."

Ils suggèrent d'utiliser .Est égal au lieu de .CompareTo lors de la recherche uniquement pour l'égalité. Je ne suis pas sûr si il y a une différence entre les deux .D'égal à égal et == pour la classe string. Je vais parfois utiliser .Est égal ou Objet.ReferenceEquals au lieu de == pour mes classes, dans le cas où quelqu'un arrive à un moment plus tard, et redéfinit l'opérateur == pour la classe.

50voto

max Points 331

Si jamais vous êtes curieux de connaître les différences dans la BCL méthodes, Réflecteur est votre ami :-)

J'ai suivi ces lignes directrices:

Exact: EDIT: j'ai déjà toujours utilisé opérateur == sur le principe qu'à l'intérieur de Equals(string, string) de l'objet, opérateur == est utilisé pour comparer les références de l'objet, mais il semble strA.Equals(ampb) est encore 1-11% plus rapidement que l'chaîne.Equals(strA, ampb), strA == ampb, et de la corde.CompareOrdinal(strA, ampb). Je boucle testé avec un Chronomètre à la fois interné/non-internés des valeurs de chaîne, avec les mêmes ou différentes longueurs de chaîne, et de différentes tailles (1B à 5 MO).

strA.Equals(strB)

Lisible par l'homme du match (cultures de l'Ouest, de la casse):

string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0

Lisible par l'homme du match (Toutes les autres cultures, insensible cas/accent/kana/etc défini par CultureInfo):

string.Compare(strA, strB, myCultureInfo) == 0

Lisible par l'homme du match avec des règles personnalisées (Tous les autres cultures):

CompareOptions compareOptions = CompareOptions.IgnoreCase
                            | CompareOptions.IgnoreWidth
                            | CompareOptions.IgnoreNonSpace;
string.Compare(strA, strB, CultureInfo.CurrentCulture, compareOptions) == 0

18voto

Comme Ed l'a dit, CompareTo est utilisé pour le tri.

Il y a une différence, cependant, entre les deux .D'égal à égal et ==.

== résout essentiellement le code suivant:

if(object.ReferenceEquals(left, null) && 
   object.ReferenceEquals(right, null))
    return true;
if(object.ReferenceEquals(left, null))
    return right.Equals(left);
return left.Equals(right);

La simple raison est la suivante va lever une exception:

string a = null;
string b = "foo";

bool equal = a.Equals(b);

Et la suite ne sera pas:

string a = null;
string b = "foo";

bool equal = a == b;

15voto

Ryszard Dżegan Points 4079

Bonne explication et pratiques à propos de la comparaison des chaînes de questions peut être trouvée dans l'article de Nouvelles Recommandations pour l'Utilisation des Chaînes de Microsoft .NET 2.0 et également dans des Pratiques Exemplaires pour l'Utilisation des Chaînes dans le .NET Framework.


Chaque méthode mentionnée (et d'autres) a usage particulier. La principale différence entre eux est ce genre de StringComparison Énumération qu'ils utilisent par défaut. Il y a plusieurs options:

  • CurrentCulture
  • CurrentCultureIgnoreCase
  • InvariantCulture
  • InvariantCultureIgnoreCase
  • Ordinal
  • OrdinalIgnoreCase

Chacun des ci-dessus le type de comparaison des objectifs différents cas d'utilisation:

  • Ordinal
    • De la casse à l'intérieur des identifiants
    • La casse des identifiants des standards comme XML et HTTP
    • Sensible à la casse paramètres liés à la sécurité
  • OrdinalIgnoreCase
    • Insensibles à la casse interne identifiants
    • Non à la casse des identifiants des standards comme XML et HTTP
    • Les chemins de fichiers
    • Clés/valeurs de registre
    • Les variables d'environnement
    • Identificateurs de ressources (poignée de noms, par exemple)
    • Insensible à la casse liés à la sécurité des paramètres de
  • InvariantCulture ou InvariantCultureIgnoreCase
    • Certains ont persisté au niveau linguistique, les données pertinentes
    • Affichage des données linguistiques nécessitant un fixe de l'ordre de tri
  • CurrentCulture ou CurrentCultureIgnoreCase
    • Données affichées à l'utilisateur
    • La plupart des entrées utilisateur

Notez que StringComparison Énumération ainsi que des surcharges pour la comparaison de chaînes de méthodes, existe depuis .NET 2.0.


Chaîne de caractères.Méthode CompareTo (String)

Est en fait le type de mise en œuvre sûre de IComparable.Méthode CompareTo. Par défaut interprétation: CurrentCulture.

Utilisation:

La méthode CompareTo a été conçu principalement pour une utilisation dans le tri ou le classement en ordre alphabétique des opérations

Ainsi

La mise en œuvre de l'interface IComparable sera nécessairement utiliser cette méthode

Chaîne de caractères.La Méthode De Comparaison

Un membre statique de la Classe String qui a de nombreuses surcharges. Par défaut interprétation: CurrentCulture.

Chaque fois que possible, vous devriez appeler une surcharge de la méthode de comparaison qui comprend un StringComparison paramètre.

Chaîne de caractères.Méthode Equals

Remplacé à partir de la classe d'Objet et de surcharge de sécurité de type. Par défaut interprétation: Ordinal. Notez que:

La classe String est l'égalité des méthodes comprennent la statique est Égale à, la statique de l'opérateur ==, et la méthode d'instance est Égal.


StringComparer classe

Il y a aussi une autre façon de traiter avec les comparaisons de chaînes en particulier vise à tri:

Vous pouvez utiliser le StringComparer classe pour créer un type spécifique de comparaison pour trier les éléments dans une collection générique. Les Classes telles que la table de hachage, Dictionnaire, SortedList, et SortedList utiliser le StringComparer classe à des fins de tri.

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