如何以最优方式不区分大小写比较IEnumerable<char>的相等性?
实现自定义字符串类的不区分大小写相等比较(多语言支持+性能优化)
核心问题分析
你当前用两次char.ToUpper()的方式存在两个明显缺陷:
- 性能冗余:每个字符需两次转换操作,额外开销随字符串长度线性增长;
- 多语言适配不足:部分文字系统的大小写映射不是一对一(如德语
ß转大写为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); } }
关键细节说明
- 快速路径判断:先检查引用相等、空值、长度不等的情况,避免不必要的字符比较,大幅提升常见场景的性能;
- 多语言适配:
CompareInfo会严格遵循指定文化的大小写规则,解决char.ToUpper()无法处理的多字符映射、区域特殊规则问题; - 性能优化:无需提前转换整个字符串的大小写,直接在原字符数组上进行区间比较,减少内存分配和计算开销;
- 哈希码一致性:
GetHashCode使用与Equals相同的比较规则生成哈希码,保证集合(如Dictionary、HashSet)的正确性。
场景化选择
- 如果是无文化依赖的二进制比较(如文件名、变量名),替换为
CompareInfo.GetCompareInfo(StringComparison.Ordinal),或直接使用StringComparer.OrdinalIgnoreCase的逻辑; - 如果需适配用户当前系统语言,则使用
CultureInfo.CurrentCulture.CompareInfo。
内容的提问来源于stack exchange,提问作者Nickolas Etyuhibosecyu
相关产品推荐
相关产品推荐

