StringComparison.OrdinalIgnoreCase是最常用且安全的忽略大小写比较方式,直接调用String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase),不创建临时字符串、不依赖文化、跨平台一致;仅适用于相等性判断,不能用于排序或分组;Dictionary等集合需显式传入StringComparer.OrdinalIgnoreCase才能生效。

StringComparison.OrdinalIgnoreCase 是最常用也最安全的忽略大小写方式
直接用 String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase),比 ToLower() + == 更快、更稳、不依赖当前线程文化。
常见错误是只写 str1.Equals(str2) 或 str1 == str2 —— 它们默认走的是 StringComparison.Ordinal(区分大小写),HTTP 头名、配置键、文件路径等场景下容易漏匹配。
- 不创建临时字符串,避免 GC 压力
- 行为跨平台一致,不受土耳其语 "I"/"i" 映射异常影响
- 仅适用于“是否相等”判断,不能用于排序或分组
Dictionary 必须传 StringComparer.OrdinalIgnoreCase 才能忽略大小写
光靠 key 调用 .Equals(..., OrdinalIgnoreCase) 没用。字典初始化时没指定比较器,"Content-Type" 和 "content-type" 就是两个不同 key。
正确写法:var headers = new Dictionary<string string>(StringComparer.OrdinalIgnoreCase)</string>
-
StringComparer.OrdinalIgnoreCase是静态只读实例,可复用,别每次new - 别混用
CurrentCultureIgnoreCase:部署到不同区域的服务器时,行为可能突变 - 集合类如
HashSet<string></string>、SortedList<string t></string>同理,必须显式传入比较器
string.Compare 的第三个 bool 参数不是你想要的“忽略大小写”
新手常写 string.Compare(a, b, true),以为 true 表示“忽略大小写”,其实它底层仍用 CurrentCulture 比较,行为不可控且不可移植。
正确做法是用四参数或五参数重载,显式指定枚举值:
- ✅
string.Compare(a, b, StringComparison.OrdinalIgnoreCase) - ✅
string.Compare(a, 0, b, 0, 5, StringComparison.Ordinal)(子串比较) - ❌
string.Compare(a, b, true)(文化敏感、不可预测)
Ordinal vs InvariantCulture:内部标识优先用 Ordinal 系列
区分大小写的内部用途(如 GUID、枚举名、JSON 字段名、路径名)一律用 StringComparison.Ordinal 或 OrdinalIgnoreCase。
它们基于 Unicode 码位二进制比较,最快、最确定;而 InvariantCulture 系列虽“固定”,但仍走文化规则,有额外开销且语义模糊。
-
Ordinal和OrdinalIgnoreCase适合:配置键、HTTP 头、文件系统路径、序列化字段 -
CurrentCulture系列只用于终端用户可见文本(如 UI 列表排序) - 永远不要在服务端逻辑里用
CurrentCulture做 key 查找——用户改个系统语言,线上就出 bug
真正容易被忽略的是:StringComparison 不是“设置一次全局生效”的东西,它必须显式传给每个比较操作。漏掉一个 Equals 调用、一个字典构造、一个 Compare 调用,就可能埋下大小写敏感的隐患。


















