我有一个简单的例程,可以根据无序对象集合中的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
答案 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()。