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

标签 c# .net 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()));

最佳答案

这取决于您所说的“为所有文化工作”是什么意思。即使在土耳其,您是否希望“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/

相关文章:

java - 选择大小变化的字符串中数据的某些部分的最佳方法

c# - DateTime.TryParseExact 返回 false

.net - 存储 NULL 而不是空白字符串列

c# - 如何使用 Autofac 注册 NodaTime.ZonedClock

c# - 如何从 Visual Studio 编辑器检索文本以与 Roslyn SyntaxTree 一起使用?

c# - 使用 Unity 自动注册所有接口(interface)

python - 如何从字符串(Wireshark 输出)中提取某些子字符串(IP 地址)?

javascript - 将逗号和哈希分隔的字符串转换为数组

c# - 如何在 Azure 辅助角色中配置远程参与者配置 (AKKA.NET)

c# - 如何将asmx服务转换为rest以通过URL调用