【问题标题】:Difference between String.Sort and Greater Than/Less Than Operators VB.NetString.Sort 和大于/小于运算符 VB.Net 之间的区别
【发布时间】:2011-09-28 14:59:44
【问题描述】:

我有一个简单的例程来根据无序对象集合中的名称属性查找下一个对象。我浏览了集合并收集了List(of String) 中的所有名称,添加了我当前名称> 的任何名称,这应该列出当前键之后的所有内容。然后我使用List(of String) 上的默认.Sort() 方法对列表进行排序,并获取列表中的第一项,这应该是我的下一项。我反向查找前一项,添加所有项目<我的当前姓名,排序,然后取出列表中的最后一项。

但是,此方法会跳过某些项目。例如,我有名为 1210、1210-ADA 和 1210_ADA_DB 的项目。使用这种方法,获取下一项会跳过中间项 1210-ADA 并找到 1210_ADA_DB,但查找上一项似乎可行。

如果我的过程是正确的,我唯一的解释是<> 运算符的比较与.Sort() 方法不同。这是真的?有什么区别?

查找下一项的代码:

        Dim Key As String = Name
        Dim NameList As New List(Of String)
        For Each obj As T In Collection
            Dim ObjKey As String = Obj.Key
            If  ObjKey > Key Then
                NameList.Add(ObjKey)
            End If
        Next
        If NameList.Count = 0 Then Return Nothing
        NameList.Sort()
        Dim NextKey As String = NameList.First

【问题讨论】:

  • 与其描述您的代码,不如发布您的代码?

标签: .net vb.net sorting string-comparison


【解决方案1】:

我想您已经发现了问题所在。但是要注释一下,您会被一些 VB6 兼容行为所困扰。选项比较的默认值是使用 String.CompareOrdinal() 的二进制。不是 List.Sort() 使用的。选项比较文本使用 CultureInfo.CompareInfo.Compare() 和 CompareOptions.IgnoreWidth、CompareOptions.IgnoreKanaType、CompareOptions.IgnoreCase 选项。也不是 List.Sort() 使用的。

避免使用运算符并改用 String.Compare()。

【讨论】:

    【解决方案2】:

    我唯一的解释是 运算符的比较与 .Sort() 方法不同。这是真的吗?

    没有。 Sort 内部使用 String.IComparable(Of String).CompareTo 方法,产生的结果与 <> 一致。

    但是,只要您没有更改项目或当前文件的Option Compare,这才是正确的。这将改变<> 的行为,但不会改变上述方法。

    【讨论】:

    • 我没有更改选项比较。根据我的项目设置选项比较设置为二进制,我认为这是默认值。
    • 你已经引导我找到我的答案,但是 显然仍然与 String.CompartTo 不同,CompareTo 的文档说 This method performs a word (case-sensitive and culture-sensitive) comparison using the current culture. Option Compart Textbases string comparisons on a case-insensitive, textual sort order determined by your application's locale.
    • @Kratz 您引用的内容仅适用于Option Compare Text。在Option Compare Binary 下,它们的行为相同(区分大小写、区分区域性)。
    • Option Compare Binary bases string comparisons on a sort order derived from the internal binary representations of the characters.,加上现在我知道我的项目设置为binary,我的代码行为证明它们是不同的。在我的示例中,-_ 的比较不同。我用 String.Compare 替换了>(所以它的比较方式相同),它现在运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2011-05-24
    • 2016-05-18
    • 2011-10-22
    • 2012-10-06
    • 2011-03-02
    相关资源
    最近更新 更多