为什么"-less"在"你好"之后而不是之前排序?

Aar*_*paa 6 .net c# sorting

我正在使用CaseInsensitiveComparer.DefaultInvariant看到一些非常奇怪的排序行为.以前导连字符" - "开头的单词最终排序,就像连字符不在那里而不是在实际字母前排序,这是其他标点符号所发生的.

所以给出{"你好",".net"," - 无"}}我最终得到{".net","hello"," - without"}而不是预期的{"-less",".net" , "你好"}.

或者,作为测试用例:

[TestMethod]
public void TestMethod1()
{
    var rg = new String[] { 
        "x", "z", "y", "-less", ".net", "- more", "a", "b"
    };

    Array.Sort(rg, CaseInsensitiveComparer.DefaultInvariant);

    Assert.AreEqual(
        "- more,-less,.net,a,b,x,y,z", 
        String.Join(",", rg)
    );
}
Run Code Online (Sandbox Code Playgroud)

......这样失败了:

Assert.AreEqual failed. 
Expected:<- more,-less,.net,a,b,x,y,z>. 
Actual:  <- more,.net,a,b,-less,x,y,z>.
Run Code Online (Sandbox Code Playgroud)

有什么想法发生了什么?

编辑:

看起来,默认情况下.NET在排序字符串时确实很奇怪,这会导致前导连字符被排序到奇怪的位置,以便合作社和合作社排序在一起.因此,如果你想要你的领导连字词结束并开始与另一个标点,你必须告诉它不要:

Array.Sort(rg, (a, b) => String.CompareOrdinal(a, b));
Run Code Online (Sandbox Code Playgroud)

For*_*lon 11

比较过程使用CultureInfo.InvariantCulture来确定排序顺序和套管规则.字符串比较可能会有不同的结果,具体取决于文化.有关特定于文化的比较的更多信息,请参阅System.Globalization命名空间和编码和本地化. 从这里.

有趣的部分:

单词排序执行文化敏感的字符串比较,其中某些非字母数字Unicode字符可能具有分配给它们的特殊权重.例如,连字符( - )可能具有非常小的权重,因此"coop"和"co-op"在排序列表中彼此相邻. 从这里.