You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以最优方式不区分大小写比较IEnumerable<char>的相等性?

实现自定义字符串类的不区分大小写相等比较(多语言支持+性能优化)

核心问题分析

你当前用两次char.ToUpper()的方式存在两个明显缺陷:

  1. 性能冗余:每个字符需两次转换操作,额外开销随字符串长度线性增长;
  2. 多语言适配不足:部分文字系统的大小写映射不是一对一(如德语ß转大写为SS、土耳其语i/I的特殊规则),直接转大小写会导致比较结果不准确。

最优实现方案

推荐基于.NET的CompareInfo类实现,它原生支持所有Unicode文字系统的大小写规则,且无需提前转换整个字符串,性能更优。同时实现IEquatable<CustomString>接口保证类型安全的比较,结合快速路径判断进一步提升性能。

代码示例

public class CustomString : IEnumerable<char>, IEquatable<CustomString>
{
    private readonly char[] _internalChars;
    public int _size; // 类内私有有效字符长度

    // 构造函数、IEnumerable<char>实现等其他逻辑...

    public bool Equals(CustomString other)
    {
        // 快速路径:引用相等直接返回true
        if (ReferenceEquals(this, other))
            return true;
        
        // 空值、类型不匹配或长度不等,直接返回false
        if (other is null || _size != other._size)
            return false;

        // 根据业务场景选择合适的CultureInfo:
        // - CurrentCulture:本地化场景
        // - InvariantCulture:跨文化持久化场景
        // - Ordinal:文件名、标识符等无文化依赖场景
        var compareInfo = CultureInfo.InvariantCulture.CompareInfo;
        
        // 直接在原字符数组上进行忽略大小写的比较
        return compareInfo.Compare(
            _internalChars, 0, _size,
            other._internalChars, 0, other._size,
            CompareOptions.IgnoreCase) == 0;
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as CustomString);
    }

    public override int GetHashCode()
    {
        // 与Equals逻辑一致,生成忽略大小写的哈希码
        return CultureInfo.InvariantCulture.CompareInfo.GetHashCode(
            new string(_internalChars, 0, _size), 
            CompareOptions.IgnoreCase);
    }

    // 可选:重载==和!=运算符,增强语法便利性
    public static bool operator ==(CustomString left, CustomString right)
    {
        return Equals(left, right);
    }

    public static bool operator !=(CustomString left, CustomString right)
    {
        return !Equals(left, right);
    }
}

关键细节说明

  1. 快速路径判断:先检查引用相等、空值、长度不等的情况,避免不必要的字符比较,大幅提升常见场景的性能;
  2. 多语言适配:CompareInfo会严格遵循指定文化的大小写规则,解决char.ToUpper()无法处理的多字符映射、区域特殊规则问题;
  3. 性能优化:无需提前转换整个字符串的大小写,直接在原字符数组上进行区间比较,减少内存分配和计算开销;
  4. 哈希码一致性:GetHashCode使用与Equals相同的比较规则生成哈希码,保证集合(如Dictionary、HashSet)的正确性。

场景化选择

  • 如果是无文化依赖的二进制比较(如文件名、变量名),替换为CompareInfo.GetCompareInfo(StringComparison.Ordinal),或直接使用StringComparer.OrdinalIgnoreCase的逻辑;
  • 如果需适配用户当前系统语言,则使用CultureInfo.CurrentCulture.CompareInfo。

内容的提问来源于stack exchange,提问作者Nickolas Etyuhibosecyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:57:08