Question

Il y a un certain nombre de façons de comparer les chaînes. Y at-il des gains de performance en faisant un rapport à un autre?

J'ai toujours opté pour comparer des chaînes comme ceci:

string name = "Bob Wazowski";
if (name.CompareTo("Jill Yearsley") == 0) {
    // whatever...
}

Mais je trouve peu de gens qui font cela, et si quoi que ce soit, je vois plus de gens qui font juste une comparaison == droite, à ma connaissance est la pire façon de comparer les chaînes. Ai-je tort?

En outre, est-il une différence dans la façon dont on compare les chaînes dans les requêtes LINQ? Par exemple, j'aime faire ce qui suit:

var results = from names in ctx.Names
              where names.FirstName.CompareTo("Bob Wazowski") == 0
              select names;

Mais encore une fois, je vois peu de gens faire des comparaisons de chaînes comme si dans leurs requêtes LINQ.

Était-ce utile?

La solution

Selon réflecteur

"Hello" == "World"

est le même que

String.Equals("Hello", "World");

qui détermine essentiellement si elles sont le même objet de référence, si l'un d'eux est nul, ce qui serait un faux automatique si l'on était nulle et l'autre pas, et compare alors chaque caractère dans une boucle dangereuse. Donc, il ne se soucie pas de règles culturelles du tout, ce qui est généralement pas une grosse affaire.

et

"Hello".CompareTo("World") == 0

est le même que

CultureInfo.CurrentCulture.CompareInfo.Compare("Hello", "World", CompareOptions.None);

Ceci est essentiellement le contraire en matière de fonctionnalité. Il prend en considération la culture, l'encodage, et tout le reste avec la chaîne dans le contexte.

Je suppose que String.CompareTo est deux ordres de grandeur plus lent que l'opérateur d'égalité .

comme pour votre LINQ il n'a pas d'importance si vous utilisez LINQ to SQL, car les deux vont générer le même SQL

var results = from names in ctx.Names
          where names.FirstName.CompareTo("Bob Wazowski") == 0
          select names;

SELECT [name fields]
FROM [Names] AS [t0]
WHERE [t0].FirstName = @p0

donc vous n'êtes pas gagner vraiment rien pour LINQ to SQL, sauf plus difficile à lire le code et probablement plus l'analyse syntaxique des expressions. Si vous utilisez juste LINQ pour des trucs standards des tableaux, puis les règles que je Disposées applique ci-dessus.

Autres conseils

À mon avis, vous devriez toujours utiliser la manière la plus claire, qui utilise ==!

Ceci peut être compris directement: Quand « Bonjour » égaux « Monde », puis faire quelque chose

.
if ("Hello" == "World")
    // ...

En interne, on invoque String::Equals existe explicitement à cet effet - comparaison de deux chaînes pour l'égalité. (Cela n'a rien à voir avec des pointeurs et des références, etc.)

Ce ici est pas immédiatement clair - Pourquoi comparer à zéro

?
if ("Hello".CompareTo("World") == 0)

.CompareTo n'a pas été conçu seulement pour vérifier l'égalité (vous avez == pour cela) - Il compare deux chaînes. Vous utilisez .CompareTo en sortes pour déterminer wheter une chaîne est « plus » qu'un autre. Vous peut vérifier l'égalité, car il donné zéro pour les chaînes égales, mais ce n'est pas ce qu'il concepted pour.

Par conséquent, il existe différentes méthodes et interfaces pour le contrôle de l'égalité (IEquatable, opérateur ==) et la comparaison (IComparable)

Linq ne se comporte pas différent de C # régulière ici.

Lire Jeff Le meilleur code est Aucun code à tout . foo.CompareTo(bar) == 0: horribles encombrement visuel. Prend beaucoup d'espace et transmet pas de sens intéressant. En fait, il met l'accent sur beaucoup de choses hors de propos qui détourne l'attention du vrai problème.

S'il y a des raisons bien définie pour utiliser cette variante plus, ne sont pas.

En ce qui concerne la performance: il ne suffit pas d'importance pour ce cas simple. Si l'opérateur d'égalité devrait vraiment faire == pire que CompareTo, ne hésitez pas à déposer un rapport de bogue avec Microsoft. Cela ne doit pas se produire.

Eh bien MSDN indique que vous shoul utilisez la fonction comparision en fonction de la tâche que vous devez effectuer:

  

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

Donc, si ce ne est pas sur le tri et la valeur retrun est pas important, je dirais que l'on devrait utiliser le:

first.Equals(second) ou si la comparaison est par exemple spécifique de la culture dans des langues comme en allemand:

String.Equals(first, second, StringComparison.CurrentCulture)

Jetez un oeil a ces liens:

Comment: comparer les chaînes (C # Guide de programmation)

String.CompareTo méthode (Object)

Il y avait une question assez similaire récemment en ce qui concerne le meilleur moyen de couper une chaîne, mais il a été essentiellement étalonnage des différentes façons de les comparer.

Vous pouvez vérifier les points de référence sur cette post.

Il y a un joli article Comparaison de valeurs pour l'égalité dans .NET: Identité et Equivalence qui est un peu plus général que seule comparaison de chaînes, mais très intéressant néanmoins.

Si l'opérateur d'égalité effectivement effectué pire que CompareTo - ne serait pas Microsoft faire la mise en œuvre de l'appel opérateur d'égalité <=>

Il suffit d'utiliser l'opérateur d'égalité pour tester l'égalité.

J'utilise généralement String.Compare avec la surcharge qui prend un paramètre StringComparison, parce que je peux être tout à fait explicite si oui ou non la comparaison est sensible à la casse et la culture. Ce besoin de .NET 2.0 ou version ultérieure.

Le plus rapide est StringComparison.Ordinal (ou StringComparison.OrdinalIgnoreCase si insensible à la casse) pour les comparaisons qui ne sont pas sensibles à la culture.

Le problème avec l'utilisation == est qu'il ne sait pas que l'auteur a examiné et sensibilité Case- de culture.

Il y a un bon article MSDN sur le sujet .

Pour meilleure façon de comparer string de C # est d'utiliser le a.Equals(b) et b sont des chaînes. Ceci est la meilleure façon de comparer la chaîne, car il compare les valeurs des objets et b , et ne dépent pas sur la référence des objets.

Si vous allez utiliser « == » symbole, le résultat sera égal si les deux objets ont la même référence, mais vous aurez un problème quand ils ont des références différentes et ont la même valeur.

compareTo est la meilleure méthode façon d'utiliser si votre test si l'autre chaîne est précédent, suivant ou apparaissant dans la même position de l'autre chaîne dans laquelle il retournera une valeur négative, valeur positive ou respectivement une valeur nulle. Il retourne également la valeur positive si le paramètre est null

est le plus complet Guide MSDN utile pour la comparaison de chaînes que j'ai trouvé.

  

Utilisation des comparaisons avec StringComparison.Ordinal ou   StringComparison.OrdinalIgnoreCase pour une meilleure performance.

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