我有一个简单的例程,可以根据无序对象集合中的名称属性查找下一个对象。我浏览集合并收集
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
我想你已经发现问题所在了。 但需要注意的是,您可能会受到某些 VB6 兼容行为的困扰。 Option Compare 的默认值是 Binary,它使用 String.CompareOrdinal()。 不是 List.Sort() 使用的。 选项比较文本将 CultureInfo.CompareInfo.Compare() 与 CompareOptions.IgnoreWidth、CompareOptions.IgnoreKanaType、CompareOptions.IgnoreCase 选项结合使用。 也不是 List.Sort() 使用的。
避免使用运算符并使用 String.Compare() 代替。
我唯一的解释是 < and > 运算符与 .Sort() 方法的比较不同。这是真的吗?
不。
Sort
内部使用String.IComparable(Of String).CompareTo
方法,其产生的结果与<
和>
一致。
Option Compare
时,这才是正确的。这将改变 <
和 >
的行为,但不会改变上述方法。
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 <.
我可以选择比较二进制。