C# 字符的StringComparer.InvariantCultureInogoreCase
如何使用任意比较器比较C# 字符的StringComparer.InvariantCultureInogoreCase,c#,case-insensitive,C#,Case Insensitive,如何使用任意比较器比较char 我尝试过使用StringComparer,但只有将char转换为字符串时,它才会起作用 var cmp = StringComparer.InvariantCultureIgnoreCase; char a = 'a'; char A = 'A'; cmp.Equals(a.ToString(), A.ToString()) //true - works cmp.Equals(a, A) //false, working on the .Equals(object
char
我尝试过使用StringComparer
,但只有将char
转换为字符串时,它才会起作用
var cmp = StringComparer.InvariantCultureIgnoreCase;
char a = 'a';
char A = 'A';
cmp.Equals(a.ToString(), A.ToString()) //true - works
cmp.Equals(a, A) //false, working on the .Equals(object,object)
我猜想会有一个对StringComparer用来比较字符的调用。如果您查看
StringComparer
类的源代码,您可以看到发生了什么。InvariantCultureIgnoreCase
成员创建CultureAwareComparer
类的新实例:
private static readonly StringComparer _invariantCultureIgnoreCase = new CultureAwareComparer(CultureInfo.InvariantCulture, true);
CultureAwareComparer
类实现了Equals(String,String)
方法,并考虑了区域性和大小写选项。它不实现Equals(Object,Object)
,Equals是在StringComparer
基类中定义的,当您尝试比较2char
s时调用。StringComparer.Equals(Object,Object)
的定义是:
public new bool Equals(Object x, Object y) {
if (x == y) return true;
if (x == null || y == null) return false;
String sa = x as String;
if (sa != null) {
String sb = y as String;
if( sb != null) {
return Equals(sa, sb);
}
}
return x.Equals(y);
}
如您所见,它将
char
s转换为String
,然后调用String.Equals(String,String)
方法,即不考虑区域性或大小写的标准String
比较。因此,如果要将char
s与StringComparer
区域性进行比较,必须首先将它们转换为字符串。1)对于简单的情况,使用char.ToLower
/char.ToUpper
可以。但我很确定它对某些unicode代码点不起作用。2) 您可以在比较之前转换为string
,但这会产生垃圾并降低性能。转换为string并使用您提到的方法有什么问题?@CodesInChaos我已经更新了问题,使用ToUpper不再是一个简单的解决方案。是的,这也是我的结论,我还进一步研究了进行字符串比较的部分,但最终得到了一个内部调用。