string(“; P”)更大还是字符串(“-_-”)更大?

时间:2012-03-02 00:06:45

标签: c# c++ char

我在排序文本文件时发现非常混乱。不同的算法/应用程序产生不同的结果,例如,比较两个字符串str1=";P"str2="-_-"

这里仅供您参考,为这些字符串中的每个字符提供ASCII:

char(';') = 59;   char('P') = 80;
char('-') = 45;   char('_') = 95;

所以我尝试了不同的方法来确定哪个字符串更大,这是我的结果:

  1. 在Microsoft Office Excel 排序命令中:

    “; P”< “-_-”

  2. C ++ std :: string :: compare(string& str2),即str1.compare(str2)

    “; P”> “-_-”

  3. C#string.CompareTo(),即str1.CompareTo(str2)

    “; P”< “-_-”

  4. C#string.CompareOrdinal(),即CompareOrdinal(w1, w2)

    “; P”> “-_-”

  5. 如图所示,结果多种多样!实际上我的直观结果应该等于方法2和4,因为ASCII(';')= 59大于ASCII(' - ')= 45。

    所以我不知道为什么Excel和C#string.CompareTo()给出了相反的答案。注意到在C#中第二个比较函数名为string.CompareOrdinal()。这是否意味着默认的C#string.CompareTo()函数不是“序数”?

    有人能解释这种不一致吗?

    任何人都可以在CultureInfo = {en-US}中解释,为什么它会告诉; P> -_-?什么是潜在的动机或原则?而且我听说过不同文化信息中的不同双重乘法。这是一种文化冲击......!

2 个答案:

答案 0 :(得分:5)

  1. std::string::compare:“字符比较的结果仅取决于其字符代码”。这很简单。
  2. String.CompareTo:“使用当前文化执行单词(区分大小写和文化敏感)比较”。所以,这不是有序的,因为典型的用户不希望事情像那样排序。
  3. String::CompareOrdinal:根据名称,“使用序数排序规则执行区分大小写的比较”。
  4. 编辑:CompareOptions有一个提示:“例如,连字符(” - “)可能会分配一个非常小的权重,以便”coop“和”co-op“显示在彼此旁边在排序列表中。“

答案 1 :(得分:3)

Excel 2003(及更早版本)进行了忽略连字符和撇号的排序,因此您的排序实际上会将;_进行比较,从而得出您拥有的结果。这是关于它的Microsoft Support link。相当稀疏,但足以说明问题。