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#排序中的字符串比较方式感到困惑.我对不工作的原因感兴趣.
这个特殊问题一直存在,我很确定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,包括空格",因为这是文本排序的完成方式.
换句话说,当你问"排序没有正确排序整数字符串列表?" 简单的答案是"嗯,不,因为当你按文本排序时,从不考虑整数部分".