比较char忽略大小写的正确方法是什么?

Bre*_*yan 47 .net c# string comparison char

我想知道比较两个字符的正确方法是什么,而忽略了适用于所有文化的案例.另外,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()));
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 81

这取决于"为所有文化工作"的含义.即使在土耳其,你想让"我"和"我"平等吗?

你可以使用:

bool equal = char.ToUpperInvariant(x) == char.ToUpperInvariant(y);
Run Code Online (Sandbox Code Playgroud)

......但是我不确定你对"作品"的理解是否符合所有文化的"有效".

当然,您可以将两个字符转换为字符串,然后在字符串上执行您想要的任何比较.效率稍差,但它确实为您提供了框架中可用的所有比较范围:

bool equal = x.ToString().Equals(y.ToString(), 
                                 StringComparison.InvariantCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

对于代理对,a Comparer<char>无论如何都不可行,因为你没有单一的char.你可以创建一个Comparer<int>.

  • 没有用于此的框架方法:字符串比较实际上是使用本机方法实现的,而不是通过下拉到 Comparer&lt;char&gt; 实现。 (3认同)

Hen*_*man 13

使用默认(不是不变量)文化:

if (char.ToLower(ch1) == char.ToLower(ch2))
{  ....  }
Run Code Online (Sandbox Code Playgroud)

或者指定一种文化:

CultureInfo myCulture = ...;
if (char.ToLower(ch1, myCulture) == char.ToLower(ch2, myCulture))
{  ....  }
Run Code Online (Sandbox Code Playgroud)