LINQ OrderBy或Sort没有为整数字符串列表正确排序?

Tru*_*ver -1 .net c# linq c#-4.0

我一直在研究对象的排序,需要对字符串进行排序,该字符串具有整数值,如"1","2".但LINQ OrderBy或SOrt inplace本身没有正确排序:

以下代码可以重现我的问题:

            var listStr = new List<string>()
            {
                "1",
                "100",
                "12"
            };

            var sortedList = listStr.OrderBy(x => x);
            var desList = listStr.OrderByDescending(x => x);
Run Code Online (Sandbox Code Playgroud)

这里,SortedList按以下顺序:"1","100","12"和deslist是"12","100","12"

我对C#排序中的字符串比较方式感到困惑.我对不工作的原因感兴趣.

ang*_*son 5

这个特殊问题一直存在,我很确定Stack Overflow上有关于该主题的重复问题.请将问题作为正确的副本关闭,我非常乐意删除我的回答.

同时...

问题是我们人类.

我们看到数字,所以我们在数字上思考.对我们来说,1小于12,12小于100.这里没有问题.

然而,问题在于我们在问一台电脑.计算机有点挑剔.特别是,如果我们要求计算机按字母顺序进行排序,它总会将我们的"事物"视为文本.这就是问题发生的地方.或者更确切地说,这是我们的期望不再与计算机将要做的事情相匹配的地方.

当被要求对字符串进行排序时,计算机将它们按字符排序为任何其他字符串排序.

我们来看看这些项目:

1
100
12
Run Code Online (Sandbox Code Playgroud)

对我们来说,自然排序顺序是1,12,100.增加顺序.

对计算机,要求做文本排序,自然顺序是不同的.

原因是它一次比较字符串一个字符.

从广义上讲,它将说"所有以1开头的字符串将在以2开头的字符串之前出现",这意味着"1"和"100"将在"2"之前出现.这与说"所有以字母A开头的单词出现在以字母B开头的单词之前"完全相同.

然后它会说"所有字符串然后有一个0来到字符串之前有1,2,3等等,最多9,包括空格",因为这是文本排序的完成方式.

换句话说,当你问"排序没有正确排序整数字符串列表?" 简单的答案是"嗯,不,因为当你按文本排序时,从不考虑整数部分".