2017-04-24 77 views
1

我试图对包含 - 和/的字符串进行排序。但我不明白输出C#中特殊字符排序问题的字符串

Console.WriteLine(@"a-b".CompareTo(@"a/b")); 
Console.WriteLine(@"-b".CompareTo(@"/b")); 
Console.WriteLine(@"a-".CompareTo(@"a/")); 
Console.WriteLine(@"-".CompareTo(@"/")); 
Console.WriteLine(@"-/".CompareTo(@"/-")); 
Console.WriteLine(@"--".CompareTo(@"//")); 

输出是

1 
1 
-1 
-1 
1 
-1 

虽然我希望所有的输出应1.我误解某事会在这里?由于

+2

'@ “ - ” 的CompareTo(@ “/”)== -1'这意味着'-'之前发生'/'按照词汇顺序 –

+2

这就是当你[阅读文档](https://msdn.microsoft.com/en-us/library/fkw3h78a(v = vs.110).aspx) – Jonesopolis

+0

这个问题是关于为什么“ab”。 CompareTo(@“a/b”)返回1,而@“a - ”。CompareTo(@“a /”)返回-1 – Mavershang

回答

2

MSDN

字符集包括忽略字符CompareTo(String) 方法执行 文化敏感的比较时不考虑此类字符。例如,如果以下代码是在.NET Framework 4或更高版本上运行的 ,则,“动物”与 “ani-mal”(使用软连字符或U + 00AD)的比较表明两个 字符串相当于

这意味着-被忽略,如果您以文化敏感的方式比较。

这将给你预期的结果(全部阴性):

Console.WriteLine(String.CompareOrdinal(@"a-b", @"a/b")); 
Console.WriteLine(String.CompareOrdinal(@"-b",@"/b")); 
Console.WriteLine(String.CompareOrdinal(@"a-",@"a/")); 
Console.WriteLine(String.CompareOrdinal(@"-",@"/")); 
Console.WriteLine(String.CompareOrdinal(@"-/",@"/-")); 
Console.WriteLine(String.CompareOrdinal(@"--",@"//")); 
+0

值得一提的是键盘上的连字符和'\ u00AD'不一样。例如,以下返回1:'@“\ u00AD”.CompareTo(@“ - ”)' –