为什么 C# OrderBy 的字符串顺序是先小写再大写?

Why does C# OrderBy with string order lowercase before uppercase?

我正在用 C# 编写代码,遇到需要我订购一系列单字符串的情况。 示例:

var list = new List<string> { "1", "A", "a", "0" };

因为我们都知道 ASCII table 在 Lower 之前列出了 Upper,所以我希望它是这样排序的 (0, 1, A, a),但它是这样排序的这个 (0, 1, a, A)

我有一个简单的例子:

        var strs = new List<string> { "1", "A", "a", "0" };
        var orderedStrs = strs.OrderBy(l => l);
        Console.WriteLine("---strs---");
        foreach(var elem in strs){
            Console.WriteLine(elem);
        }
        Console.WriteLine("---orderedStrs---");
        foreach(var elem in orderedStrs){
            Console.WriteLine(elem);
        }

        var chars = new List<char> { '1', 'A', 'a', '0' };
        var orderedChars = chars.OrderBy(ch => ch);
        Console.WriteLine("---chars---");
        foreach(var elem in chars){
            Console.WriteLine(elem);
        }
        Console.WriteLine("---orderedChars---");
        foreach(var elem in orderedChars){
            Console.WriteLine(elem);
        }

这是输出:

        ---strs---
        1
        A
        a
        0
        --- orderedStrs---
        0
        1
        a
        A
        ---chars---
        1
        A
        a
        0
        --- orderedChars---
        0
        1
        A
        a

有人能回答我这个问题吗?

您可以使用 OrderBy(a => a, StringComparer.Ordinal)

var strs = new List<string> { "1", "A", "a", "0" };
var orderedStrs = strs.OrderBy(l => l);
Console.WriteLine("---strs---");
foreach (var elem in strs.OrderBy(a => a, StringComparer.Ordinal))
{
    Console.WriteLine(elem);
}

结果

---strs---
0
1
A
a