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
基类中定义的,当您尝试比较2
char
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不再是一个简单的解决方案。是的,这也是我的结论,我还进一步研究了进行字符串比较的部分,但最终得到了一个内部调用。