【问题标题】:Why is string array getting sorted improperly? [duplicate]为什么字符串数组排序不正确? [复制]
【发布时间】:2017-10-09 13:21:43
【问题描述】:

我是 C# 的新手,刚刚遇到了一个奇怪的行为。

这是一段脚本,应该按字母顺序(A-Z)对字符串数组进行排序

这是数组:

IFF-7/12
IFA-7/11
IFF-7/8
IFF-7/2
IFF-7/11
IFF-7/1
IF-7/1
IFF-7/6
IFF-7/9
IFF-7/13
IFF-7/14
IF-7/2

所以我想结果应该是:

IF-7/1
IF-7/2
IFA-7/11
IFF-7/1
IFF-7/2
IFF-7/6
IFF-7/8
IFF-7/9
IFF-7/11
IFF-7/12
IFF-7/13
IFF-7/14

程序脚本:

 for (int i = 0; i < faculty.GroupCount; i++)
        {
            for (int j = i + 1; j < faculty.GroupCount; j++)
            {
                if (faculty.Groups[j].Name.CompareTo(faculty.Groups[i].Name) < 0)
                {
                    temp = faculty.Groups[i];
                    faculty.Groups[i] = faculty.Groups[j];
                    faculty.Groups[j] = temp;
                }
            }
        }

但实际结果是

IF-7/1
IF-7/2
IFA-7/11
IFF-7/1
IFF-7/11
IFF-7/12
IFF-7/13
IFF-7/14
IFF-7/2
IFF-7/6
IFF-7/8
IFF-7/9

我知道它在做什么,但我不知道为什么。 我也不能使用像 .sort 这样的任何库或方法。

感谢您的帮助。

【问题讨论】:

  • 您应该使用IComparer&lt;T&gt; 来实现此功能:msdn.microsoft.com/en-us/library/8ehhxeaf(v=vs.110).aspx
  • 因为按字符串排序的数字排在 1,10,11,12,2,3,4,5,6,7,8,9 .. 因为所有数字都排在 2.. 之前。跨度>
  • 您想要的称为自然排序顺序,而不是字母排序顺序(CompareTo 的默认实现)。关于自然排序有多个较老的问题:123。您可能想检查它们并将那里的代码应用于您的特定问题。
  • 你假设的结果是不正确的,因为假设破折号-在字母之后排序,而实际上它在字母之前排序,甚至在数字之前(它的十六进制代码是0x45,而代码零'0' 是 0x48)。

标签: c# arrays sorting


【解决方案1】:

12 之前的顺序与AB 之前的顺序相同,所以112 之前。

您似乎想要通常称为“自然排序”的东西,它类似于字母排序,只是开头相同的两个字符串的数字不同,然后是整个数字的数值(所有位数)进行比较。这不是 .NET 框架直接提供的排序规则,而是 answers like this 解释如何创建一个进行自然排序的 IComparer&lt;string&gt;

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2020-07-14
    相关资源
    最近更新 更多