2009-12-10 3 views
2

Je crois que ces 2 lignes sont équivalentes, mais après avoir rencontré un problème étrange, je ne crois plus que ce soit le cas.Équivalents de comparaison de chaînes

String mimeType = context.Request.ContentType; 
(String.Compare("text/xml", mimeType, true) == 0)) 

est le même que:

context.Request.ContentType.ToLower().Equals("text/xml") 

sont leurs mises en œuvre dans le CLR différent?

Répondre

5

Ils ne sont pas complètement équivalents; voir here.

Voici la bonne façon de faire un cas comparaison insensible:

bool areSame = str1.Equals(str2, StringComparison.OrdinalIgnoreCase); 

De cette façon, sera également plus efficace becasue n'attribue pas une chaîne distincte pour la copie minuscule.

+2

Cela fonctionnera pour 99,999% des cas, mais pourrait échouer à certains moments. Voir 'The Turkish-I Problem' http://msdn.microsoft.com/en-us/library/ms973919.aspx – Gonzalo

+0

@SLaks: Je ne suis pas sûr de ce que le point était, mais' OrdinalIgnoreCase' ne _not_ résoudre le turc -Je problème. –

+0

@Pavel: Je ne le savais pas; Merci. – SLaks

0

la mise en œuvre Comparer (string, string, boolean) dans .NET:

public static int Compare(string strA, string strB, bool ignoreCase) 
{ 
    if (ignoreCase) 
    { 
     return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase); 
    } 
    return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None); 
} 

et equals

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
public bool Equals(string value) 
{ 
    if ((value == null) && (this != null)) 
    { 
     return false; 
    } 
    return EqualsHelper(this, value); 
} 

Alors, est-pas la même chose.

6

Ils ne sont pas équivalents, et ToLower/ToUpper peut avoir des problèmes de localisation. La façon de comparer deux chaînes sans sensibilité à la casse (compte tenu de l'une des chaînes peut être nul, ce qui est la raison pour laquelle je n'aime pas la méthode str1.equals) est la méthode String.Equals statique:

bool areEqual = String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase); 
+0

Version préférée en raison de la manipulation sûre 'null', mais le commentaire de Gonzalo à l'autre réponse s'applique ici aussi, et devrait être pris en compte. –

1

En Outre les autres réponses (@SLaks, @Serhio), je me sens également obligé de souligner que .ToLower() génère une autre chaîne. Comparez pas autant que je sache. La génération excessive de chaînes dans une application peut revenir vous mordre en termes d'utilisation de la mémoire et de performance si elle est fréquemment appelée.

+0

Je l'ai fait remarquer (dans la dernière ligne) – SLaks

+0

Hehe ... voir que maintenant ... –