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

问题描述 投票:0回答:3

我有一个简单的例程,可以根据无序对象集合中的名称属性查找下一个对象。我浏览集合并收集

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
.net vb.net sorting string-comparison
3个回答
2
投票

我想你已经发现问题所在了。 但需要注意的是,您可能会受到某些 VB6 兼容行为的困扰。 Option Compare 的默认值是 Binary,它使用 String.CompareOrdinal()。 不是 List.Sort() 使用的。 选项比较文本将 CultureInfo.CompareInfo.Compare() 与 CompareOptions.IgnoreWidth、CompareOptions.IgnoreKanaType、CompareOptions.IgnoreCase 选项结合使用。 也不是 List.Sort() 使用的。

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


1
投票

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

不。

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

但是,只有当您没有更改项目或当前文件的

Option Compare
时,这才是正确的。这将改变
<
>
的行为,但不会改变上述方法。


0
投票
Dim lststrSort As New List(Of String) From {"D", "d"}
lststrSort.Sort()

print(lststrSort) ' {d, D}
print("d" < "D") '  False
print(String.Compare("d", "D") < 0) ' True

String.Compare 和 < work differntly, sorting lists is consistant with String.Compare, but not with <.

我可以选择比较二进制。

© www.soinside.com 2019 - 2024. All rights reserved.