资讯动态

.NET 字符串比较:Ordinal、InvariantCulture 和 Culture

发布时间:2026/10/15 13:34:52 来源:尧图企业网站定制
程序内部用的字符串用Ordinal展示给人看的文字用CurrentCulture。记住这句话90% 的场景就不会选错。下面解释为什么。一、为什么字符串比较有好几种因为两个字符串谁排前面有两种完全不同的标准计算机的标准每个字符都有一个编号按编号大小比。人的标准像查字典一样按字母顺序比。这两种标准经常给出相反的结果。StringComparer就是让你选择用哪种标准。二、Ordinal按编号比每个字符在计算机里都有一个编号数字 0~9 48~57 大写 A~Z 65~90 小写 a~z 97~122 é 233Ordinal 只看编号大小从左往右逐个比遇到第一个不同的字符就定胜负。所以它的排序是数字 → 大写字母 → 小写字母 → 带重音的字母。例子avsBa 的编号是 97B 的编号是 6697 更大所以a排在后面三、InvariantCulture像查英文字典它分三轮比较前一轮分出胜负就不再往下比第 1 轮只看字母忽略大小写和重音第 2 轮看重音没有重音的在前第 3 轮看大小写小写在前例子比较结果原因avsBa 在前第 1 轮字典里 a 在 b 前面resumevsrésuméresume 在前第 1 轮打平第 2 轮没重音的在前applevsAppleapple 在前前两轮打平第 3 轮小写在前四、同一对单词两种规则结果相反applevsZebra规则怎么比谁在前Ordinala97Z90Z 编号更小ZebraInvariantCulture字典里 a 在 z 前面apple对一组单词排序差别更明显Ordinal: Apple, Zebra, apple, banana InvariantCulture: apple, Apple, banana, Zebra第二种才是人觉得正常的顺序。五、既然 InvariantCulture 更像人为什么程序里推荐 Ordinal因为 InvariantCulture 有三个缺点慢。它要做三轮比较Ordinal 只比数字。会看不见某些字符。比如软连字符这种不可见字符会被直接忽略coop和中间藏了一个不可见字符的co­op会被判断为相等。如果用它做安全校验可能被人绕过。结果可能因系统而异。它依赖操作系统的语言库不同版本可能有细微差别。而程序内部的字符串字典的键、文件名、配置项、网址根本不需要像人一样排序只需要快、准、永远不变。这正是 Ordinal 的优点。六、Culture 是什么Culture区域性就是**“某个国家或地区的书写习惯”**比如zh-CN中国大陆中文、en-US美国英语、de-DE德国德语。它不只影响字符串比较还影响很多东西影响什么美国 en-US德国 de-DE数字1,234.561.234,56货币$1,234.561.234,56 €日期10/13/202613.10.2026一个常见的坑在德国电脑上double.Parse(1.5)得到的是15而不是 1.5因为德国人用点号作千位分隔符。三种 Culture 的区别CurrentCulture跟着用户电脑的设置走。中国用户看到中国格式德国用户看到德国格式。InvariantCulture固定不变的通用格式基于英语在任何电脑上都一样。适合保存文件、写配置。具体某个 Culture比如new CultureInfo(de-DE)你指定用哪国规则就用哪国。七、OrdinalIgnoreCase 是怎么忽略大小写的简单理解把字母都转成大写再按编号比。所以Hello和HELLO相等。需要知道的两个细节它一个字符对一个字符地转换。德语的ß不会变成SS所以Straße和STRASSE不相等。它不受用户电脑设置影响。在土耳其语环境下i的大写是İ带点如果用CurrentCultureIgnoreCasefile和FILE会被判断为不相等。而OrdinalIgnoreCase永远判断为相等。所以不要写a.ToUpper() b.ToUpper()直接用OrdinalIgnoreCase更快也更安全。八、怎么选一张表搞定场景用哪个字典的键、标识符、Linux 文件名OrdinalHTTP 头、Windows 文件名、环境变量OrdinalIgnoreCase给用户看的列表排序CurrentCulture给用户用的搜索框CurrentCultureIgnoreCase需要按字典排序但要求每台电脑结果一样InvariantCulture把数字、日期保存到文件或 JSONCultureInfo.InvariantCulture用于格式化九、动手试试新建控制台项目把下面代码粘贴到Program.cs运行dotnet runusingSystem.Globalization;string[]words{banana,Apple,apple,Zebra};// 1. 两种规则排序对比Console.WriteLine(Ordinal: string.Join(, ,words.OrderBy(ww,StringComparer.Ordinal)));Console.WriteLine(InvariantCulture: string.Join(, ,words.OrderBy(ww,StringComparer.InvariantCulture)));// 2. 忽略大小写的字典vardictnewDictionarystring,int(StringComparer.OrdinalIgnoreCase){[Name]1};Console.WriteLine(找到 name 吗dict.ContainsKey(name));// True// 3. 土耳其语陷阱CultureInfo.CurrentCulturenewCultureInfo(tr-TR);Console.WriteLine(CurrentCultureIgnoreCase: StringComparer.CurrentCultureIgnoreCase.Equals(file,FILE));// FalseConsole.WriteLine(OrdinalIgnoreCase: StringComparer.OrdinalIgnoreCase.Equals(file,FILE));// True// 4. 德国格式解析陷阱Console.WriteLine(德国解析 1.5 double.Parse(1.5,newCultureInfo(de-DE)));// 15总结Ordinal 按编号比快、准、永远不变适合程序内部。InvariantCulture 按字典比字母 → 重音 → 大小写适合需要固定结果的人类可读排序。CurrentCulture 按用户所在地区的习惯比适合展示给用户。Culture不只管比较还管数字、货币、日期的格式。OrdinalIgnoreCase 转大写后按编号比忽略大小写时的首选。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑