String.Sort和大于/小于运算符VB.Net之间的区别

时间:2011-09-28 14:59:44

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

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

但是,此方法会跳过某些项目。例如,我有名为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

2 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:1)

我想你已经找到了问题所在。但要注释,你会被一些VB6 compat行为所咬。 Option Compare的默认值是Binary,它使用String.CompareOrdinal()。不是List.Sort()使用的。选项比较文本使用CultureInfo.CompareInfo.Compare()与CompareOptions.IgnoreWidth,CompareOptions.IgnoreKanaType,CompareOptions.IgnoreCase选项。也不是List.Sort()使用的。

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