C# 字符串排序...如何比较非序数,但对于以相同字母开头的字符串,在大写后加上小写?

C# String sorting... how to compare non-Ordinal but put lowercase after uppercase for strings starting with same letter?

提问人:Zeldarulah 提问时间:10/5/2023 更新时间:10/6/2023 访问量:64

问:

假设我有四个字符串 abc、Abc、Bca 和 bca。要求是这些将排序(按字母顺序排列时)为 Abc、abc、Bca、bca。

使用此代码:

names.Sort((a, b) => string.Compare(a, b));

它按 abc、Abc、bca、bca 排序。如果我添加 StringComparison.Ordinal 参数,则它排序为 Abc、Bca、abc、bca。我可以传递任何参数来使其返回 Abc、abc、Bca、bca 而无需额外排序一次?

谢谢

C# 字符串 列表 按字母顺序排序

评论

1赞 Panagiotis Kanavos 10/5/2023
您是否尝试过任何区分大小写的选项?
0赞 Zeldarulah 10/5/2023
含义:StringComparison。(任何不包含 IgnoreCase 的内容)?是的。使用忽略大小写只会使它不一致 - 就像你可能会得到 abc、Abc、Bca、bca 或其他东西一样。
0赞 Panagiotis Kanavos 10/5/2023
除了 Ordinal 之外,它们还起作用了 - As 始终如一地在 B 之前排序,并且考虑到了情况。您似乎希望在小写字母之前对大写字母进行排序。大写字母出现在小写字母之后,因为这是(基本上是美国)和您当地文化中指定的顺序。如果你的文化有不同的规则,大写字母会先于小写字母。InvariantCulture
0赞 Zeldarulah 10/5/2023
这正是我问的问题,你是什么意思?
1赞 ProgrammingLlama 10/5/2023
您可以创建一个自定义的 Compare 函数,该函数首先比较 using ,然后如果结果为 0,则比较每个 using 的第一个字母并将其作为结果返回。但是,如果字符串中间有大写字母,那会有点奇怪,因为这仍然会不区分大小写。如果可能的话,我认为不这样做可能是更好的解决方案。OrdinalIgnoreCaseOrdinal

答:

3赞 Charlieface 10/6/2023 #1

您可以使用自定义比较器,该比较器首先对不区分大小写的排序,然后仅当字符串相同时才对大小写进行排序。

names.Sort((a, b) => {
    var compare = string.Compare(a, b, StringComparison.OrdinalIgnoreCase);
    if (compare != 0)
        return compare;
    compare = string.Compare(a, b, StringComparison.Ordinal);
    return compare;
});

dotnetfiddle