【发布时间】:2025-12-26 00:30:06
【问题描述】:
在对文本文件进行排序时,我发现非常混乱。不同的算法/应用程序会产生不同的结果,例如比较两个字符串str1=";P" 和str2="-_-"
仅供参考,这里给出了这些字符串中每个字符的 ASCII:
char(';') = 59; char('P') = 80;
char('-') = 45; char('_') = 95;
所以我尝试了不同的方法来确定哪个字符串更大,这是我的结果:
-
在 Microsoft Office Excel 排序命令中:
";P"
-
C++ std::string::compare(string &str2),即
str1.compare(str2)";P" > "-_-"
-
C# string.CompareTo(),即
str1.CompareTo(str2)";P"
-
C# string.CompareOrdinal(),即
CompareOrdinal(w1, w2)";P" > "-_-"
如图所示,结果各不相同!实际上我的直观结果应该等于方法 2 和 4,因为 ASCII(';') = 59 大于 ASCII('-') = 45 。
所以我不知道为什么 Excel 和 C# string.CompareTo() 给出了相反的答案。请注意,在 C# 中,第二个比较函数名为 string.CompareOrdinal()。这是否意味着默认的 C# string.CompareTo() 函数不是 "Ordinal" ?
谁能解释这种不一致?
谁能在 CultureInfo = {en-US} 中解释一下,为什么它告诉 ;P > -_- ? 潜在的动机或原则是什么?而且我听说过不同文化信息中的不同双倍乘法。这是一种文化冲击..!
【问题讨论】:
-
看
CompareTo()中的第二个参数。 -
除了基于序数值的排序之外,另外两个选项是长度比较(不太可能)或字典比较,这很可能是您的“意外”结果的情况。此外,“更大”在这里确实是错误的词。 “更大”的字符串是“-_-”,因为它是 3 个字符,而“;P”是 2 个字符。
-
Order of punctuation marks vs letters 的可能副本。查看我的答案中的链接 - 特别是 CompareOptions.StringSort 之一。