Quelle est la bonne manière de comparer le cas ignorant le caractère?

Je me demande quelle est la bonne façon de comparer deux personnages en ignorant les cas qui fonctionneront pour toutes les cultures. En outre, Comparer.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’ IComparer

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

 public class CaseInsensitiveCharComparer : IComparer { 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())); 

Cela dépend de ce que vous entendez par “travailler pour toutes les cultures”. Voudriez-vous que “je” et “moi” soient égaux 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 caractères en chaînes, puis effectuer la comparaison souhaitée sur les chaînes. Un peu moins efficace, mais cela vous donne toute la gamme de comparaisons disponibles dans le cadre:

 bool equal = x.ToSsortingng().Equals(y.ToSsortingng(), SsortingngComparison.InvariantCultureIgnoreCase); 

Pour les paires de substitution, un Comparer ne sera pas faisable de toute façon, car vous n’avez pas un seul caractère. Vous pourriez créer un Comparer si.

En utilisant la culture par défaut (ce n’est pas l’invariant):

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

Ou spécifiez une culture:

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

Si je comprends bien, il n’y a pas vraiment de moyen de “travailler pour toutes les cultures”. Soit vous souhaitez comparer des caractères pour une sorte de raison interne non affichée à l’utilisateur (dans ce cas, vous devez utiliser InvariantCulture), ou vous souhaitez utiliser la CurrentCulture de l’utilisateur. Évidemment, l’utilisation de la culture actuelle de l’utilisateur signifie que vous obtiendrez des résultats différents selon les parameters régionaux, mais ils seront cohérents avec ce que les utilisateurs de ces environnements locaux attendent.

Sans en savoir plus sur pourquoi vous comparez deux personnages, je ne peux pas vraiment vous conseiller sur celui que vous devriez utiliser.

ssortingng.Compare (“ssortingng a”, “STRING A”, true)

Il fonctionnera pour chaque chaîne

Tu pourrais essayer:

  class Test{ static int Compare(char t, char p){ return ssortingng.Compare(t.ToSsortingng(), p.ToSsortingng(), SsortingngComparison.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 …

Ce que je pensais qui serait disponible dans le runtime est quelque chose comme le suivant

 public class CaseInsensitiveCharComparer : IComparer { 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())); 

Je recommanderais de comparer les majuscules, et si elles ne correspondent pas alors en comparant les minuscules, juste au cas où la logique de majuscules et de minuscules de la locale se comporte légèrement différente.

Addenda

Par exemple,

 int CompareChar(char c1, char c2) { int dif; dif = char.ToUpper(c1) - char.ToUpper(c2); if (diff != 0) dif = char.ToLower(c1) - char.ToLower(c2); return dif; } 

Vous pouvez fournir le dernier argument comme true pour la correspondance caseInsensetive

 ssortingng.Compare(lowerCase, upperCase, true);