47 votes

Quelle est la bonne façon de comparer les caractères ignorant la casse?

Je me demande quelle est la bonne façon de comparer deux personnages en ignorant la casse qui fonctionnera pour toutes les cultures. De plus, Comparer<char>.Default le meilleur moyen de tester deux caractères sans ignorer la casse? Est-ce que cela fonctionne pour les paires de substitution?

EDIT : ajout de l'échantillon IComparer<char> implémentation

Si cela aide quelqu'un, c'est ce que j'ai décidé d'utiliser

 public class CaseInsensitiveCharComparer : IComparer<char> {
    private readonly System.Globalization.CultureInfo ci;
    public CaseInsensitiveCharComparer(System.Globalization.CultureInfo ci) {
        this.ci = ci;
    }
    public CaseInsensitiveCharComparer()
        : this(System.Globalization.CultureInfo.CurrentCulture) { }
    public int Compare(char x, char y) {
        return Char.ToUpper(x, ci) - Char.ToUpper(y, ci);
    }
}

// Prints 3
Console.WriteLine("This is a test".CountChars('t', new CaseInsensitiveCharComparer()));
 

81voto

Jon Skeet Points 692016

Cela dépend de ce que tu veux dire par "travail de toutes les cultures". Voudriez-vous "i" et "I" pour être équivalent, même en Turquie?

Vous pouvez utiliser:

bool equal = char.ToUpperInvariant(x) == char.ToUpperInvariant(y);

... mais je ne suis pas sûr que cela "fonctionne" selon toutes les cultures par votre compréhension des "œuvres".

Bien sûr, vous pouvez convertir les deux personnages à cordes et ensuite effectuer quelle que soit la comparaison que vous voulez sur les cordes. Un peu moins efficace, mais il ne vous donner toute la gamme de sources de données disponibles dans le cadre:

bool equal = x.ToString().Equals(y.ToString(), 
                                 StringComparison.InvariantCultureIgnoreCase);

13voto

Henk Holterman Points 153608

En utilisant la culture par défaut (qui n'est pas invariante):

 if (char.ToLower(ch1) == char.ToLower(ch2))
{  ....  }
 

Ou spécifiez une culture:

 CultureInfo myCulture = ...;
if (char.ToLower(ch1, myCulture) == char.ToLower(ch2, myCulture))
{  ....  }
 

2voto

Jon Grant Points 7560

Si je comprends bien, il n'est pas vraiment une façon de "travailler pour toutes les cultures". Vous souhaitez comparer les caractères d'une sorte internes, non affiché à l'utilisateur la raison (dans ce cas, vous devez utiliser le InvariantCulture), ou si vous souhaitez utiliser le CurrentCulture de l'utilisateur. De toute évidence, à l'aide de l'utilisateur actuel de la culture, cela signifie que vous obtiendrez des résultats différents dans des endroits différents, mais ils seront en accord avec ce que vos utilisateurs dans les paramètres régionaux attendre.

Sans en savoir plus sur POURQUOI vous comparez deux personnages, je ne peux pas vraiment vous conseiller sur lequel vous devriez être en utilisant.

0voto

ahawker Points 1761

Tu pourrais essayer:

     class Test{
    static int Compare(char t, char p){
        return string.Compare(t.ToString(), p.ToString(), StringComparison.CurrentCultureIgnoreCase);
    }
}
 

Mais je doute que ce soit la façon "optimale" de le faire, mais je ne suis pas tous les cas que vous devez vérifier ...

-1voto

Sergio Points 5161

string.Compare ("string a", "STRING A", true)

Cela fonctionnera pour chaque chaîne

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