为什么“-less”排在“hello”之后,而不是排在“hello”之前?我看到一些使用CaseInsensitiveComparer.DefaultInvariant的非常奇怪的排序行为。以连字符“-”开头的单词最终排序时就好像连字符不存在一样,而不是在实际字母之前排序,这是其他标点符号发生的情况。所以给定{"hello",".net","--without"}我最终得到{".net","hello","--without"}而不是预期的{"-less",".净”,“你好”}。或者,作为测试用例:[TestMethod]publicvoidTestMethod1(){varrg=newString[]{"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));}...这失败了:Assert.AreEqual失败。预期的:。实际的:。任何想法发生了什么?编辑:看起来.NET在对字符串进行排序时默认情况下确实有点奇怪,这导致前导连字符被排序到奇怪的位置,以便合作社和合作社一起排序。所以如果你想让你的前导连字符结束并以另一个标点符号开始,你必须告诉它不要:Array.Sort(rg,(a,b)=>String.CompareOrdinal(a,b));compare过程使用CultureInfo.InvariantCulture来确定排序顺序和大小写规则。字符串比较可能会产生不同的结果,具体取决于文化。有关特定于文化的比较的详细信息,请参阅System.Globalization命名空间和编码和本地化。从这里。有趣的部分:wordsort执行文化敏感的字符串比较,其中某些非字母数字Unicode字符可能具有分配给它们的特殊权重。例如,连字符(-)的权重可能很小,因此“coop”和“co-op”在排序列表中彼此相邻。从这里。要按照您想要的方式对字符串进行排序,您必须创建一个比较器类,使用Compareinfo类来比较字符串。此类允许您指定各种比较方法,最适合您需要的方法是OrdinalIgnoreCase。来自MSDN:IgnoredSearchValues比较操作,例如由IndexOf或LastIndexOf方法执行的操作,如果省略要搜索的值,可能会产生意想不到的结果。如果搜索值是空字符串(""),一个字符或由一个字符组成的字符串或由一个字符组成的字符串,其代码点由于比较选项而在操作中不被考虑,或者具有一个代码的值语言意义的要点。例如,如果IndexOf方法的搜索值为空字符串,则返回值为零。注意如果可能,应用程序应使用接受CompareOptions值的字符串比较方法来指定预期的比较类型。作为一般规则,使用语言选项(使用当前区域性)最好满足面向用户的比较,而安全比较应指定Ordinal或OrdinalIgnoreCase。指定Ordinal或OrdinalIgnoreCase。我已经修改了你的测试用例并且这个测试用例正确执行:publicclassMyComparer:Comparer{privatereadonlyCompareInfocompareInfo;publicMyComparer(){compareInfo=CompareInfo.GetCompareInfo(CultureInfo.InvariantCulture.Name);}publicoverrideintCompare(stringx,stringy){returncompareInfo.Compare(x,y,CompareOptions.OrdinalIgnoreCase);}}publicclassClass1{[Test]publicvoidTestMethod1(){varrg=newString[]{“x”,“z”,“y”,“-less”,“.net”,“-more”,"a","b"};Array.Sort(rg,newMyComparer());Assert.AreEqual("-more,-less,.net,a,b,x,y,z",String.Join(",",rg));出于排序目的,我的猜测是在字母被忽略之前中断。当您对单词列表进行排序时,您希望“国际”和“国际”彼此相邻,不是吗?另一方面,破折号本身被认为很重要。排序顺序取决于文化,因此您不能假设字符将按ASCII顺序排序。http://msdn.microsoft.com/en-us/library/a7zyyk0c.aspx在你的例子中,“h”(U+0048)出现在“dash”(U+2013)之前,所以“hello”会出现在“之前”-较少的”。""(U+002E)出现在两者之前,所以".net"出现在第一位。以上是C#学习教程:为什么"-less"排在"Hello"之后,而不是排在前面?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
