我想知道比较两个忽略大小写的字符的正确方法对所有文化都适用。另外,是 Comparer<char>.Default
在不忽略大小写的情况下测试两个字符的最佳方法?这对代理对有效吗?
编辑:添加示例 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()));
最佳答案
这取决于您所说的“为所有文化工作”是什么意思。即使在土耳其,您是否希望“i”和“I”相等?
你可以使用:
bool equal = char.ToUpperInvariant(x) == char.ToUpperInvariant(y);
...但根据您对“有效”的理解,我不确定这是否适用于所有文化。
当然,您可以将两个字符都转换为字符串,然后对字符串执行任何您想要的比较。效率稍低,但它确实为您提供了框架中可用的所有比较范围:
bool equal = x.ToString().Equals(y.ToString(),
StringComparison.InvariantCultureIgnoreCase);
对于代理对,一个 Comparer<char>
无论如何都不可行,因为你没有一个 char
.你可以创建一个 Comparer<int>
虽然。
关于c# - 比较 char 忽略大小写的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1394877/