比较char忽略大小写的正确方法是什么?
我想知道什么是正确的方式比较两个字符忽略案件,将适用于所有文化。 另外, Comparer<char>.Default
是testing两个字符而不忽略大小写的最佳方法吗? 这是否适用于代理对?
编辑 :添加示例IComparer<char>
实现
如果这有助于任何人,这是我决定使用的
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()));
这取决于“为所有文化而工作”的含义。 你想在土耳其“我”和“我”是平等的吗?
你可以使用:
bool equal = char.ToUpperInvariant(x) == char.ToUpperInvariant(y);
…但是我不确定这个“作品”是否符合所有文化。
当然,你可以将两个字符转换为string,然后在string上执行任何你想要的比较。 效率稍低一些,但它确实为您提供了框架中可用的所有比较范围:
bool equal = x.ToString().Equals(y.ToString(), StringComparison.InvariantCultureIgnoreCase);
对于代理对来说, Comparer<char>
是不可能的,因为你没有一个char
。 你可以创build一个Comparer<int>
。
使用默认(这不是不变的)文化:
if (char.ToLower(ch1) == char.ToLower(ch2)) { .... }
或者指定一种文化:
CultureInfo myCulture = ...; if (char.ToLower(ch1, myCulture) == char.ToLower(ch2, myCulture)) { .... }
据我所知,没有一种方法可以“适用于所有文化”。 您要比较某种内部非显示对用户原因的字符(在这种情况下,您应该使用InvariantCulture),或者要使用用户的CurrentCulture。 显然,使用用户当前的文化将意味着您将在不同的语言环境中获得不同的结果,但它们将与这些语言环境中的用户所期望的一致。
不知道为什么你比较两个字符,我不能真正告诉你,你应该使用哪一个。
string.Compare(“string a”,“STRING A”,true)
它将适用于每一个string
你可以尝试:
class Test{ static int Compare(char t, char p){ return string.Compare(t.ToString(), p.ToString(), StringComparison.CurrentCultureIgnoreCase); } }
但我怀疑这是做到这一点的“最佳”方式,但我并不是所有需要检查的情况。
我正在考虑在运行时可用的内容如下所示
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()));
我会build议比较大写,如果他们不匹配,然后比较小写,以防万一地区的大写和小写逻辑performance略有不同。
附录
例如,
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; }