C#字符串排序:如何非Ordinal比较且同首字母小写后置?
字符串排序问题解答
不存在直接可用的StringComparison枚举参数,能一步得到你想要的Abc、abc、Bca、bca排序结果,原因如下:
- 不带参数的
string.Compare(a, b)使用当前线程的文化默认排序规则,会将小写字母优先排在对应大写字母前面,所以得到abc、Abc、bca、Bca的结果。 - 传入
StringComparison.Ordinal时,是按ASCII码值排序,所有大写字母的ASCII值小于小写字母,因此所有大写开头的字符串会整体排在小写开头的字符串前面,得到Abc、Bca、abc、bca的结果,不符合你要的「同字母组合的大写在前、小写在后」的分组需求。
要实现目标排序,你可以自定义比较逻辑,先按大小写不敏感的规则排序,当两个字符串忽略大小写后相等时,再按大小写敏感的规则让大写在前:
names.Sort((a, b) => { // 先忽略大小写比较 int caseInsensitiveResult = string.Compare(a, b, StringComparison.OrdinalIgnoreCase); if (caseInsensitiveResult != 0) return caseInsensitiveResult; // 忽略大小写相等时,按Ordinal规则排序(大写ASCII值更小,会排在前面) return string.Compare(a, b, StringComparison.Ordinal); });
这段代码会先把Abc和abc归为一组、Bca和bca归为一组,再在组内让大写开头的字符串排在前面,最终得到你要的Abc、abc、Bca、bca排序结果。
内容的提问来源于stack exchange,提问作者Zeldarulah
相关产品推荐
相关产品推荐

