我正在使用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)