2012-07-20 96 views
1

我有一个对象列表,它存储了我所做的源搜索的搜索结果。在添加到列表中时,我会为该对象提供有关结果相关性的评分,以便我可以将这些结果推到顶部。IComparable没有正确排序对象

我的对象实现IComparable接口,并有一个compareto函数,所有编译都正确,但是当我对列表(list.sort())进行排序时,这似乎对结果没有任何影响(较高的评分项目不在底部)

任何人都可以建议我做错了什么?

Public Class SearchFeedItem 
    Implements IComparable 

    Private _score As Integer = 0 

    Public Property Score() As Integer 
     Get 
      Return _score 
     End Get 
     Set(ByVal value As Integer) 
      _score = value 
     End Set 
    End Property 

    Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo 
     Dim OtherItem As SearchFeedItem = CType(obj, SearchFeedItem) 

     If Me.Score < OtherItem.Score Then 
      Return 1 
     End If 

     If Me.Score > OtherItem.Score Then 
      Return -1 
     Else 
      Return 0 
     End If 
    End Function 

End Class 
+0

我已经实现如上述,但仍不能正确排序,新的代码:公共功能的CompareTo(BYVAL其他作为SearchFeedItem)作为整数器具System.IComparable(OF SearchFeedItem).CompareTo 如果Me.Score other.Score然后 返回-1 Else Return 0 End If End Function – 2012-07-20 11:55:04

回答

1

如果你想在底部的高计分项目,应该是

Public Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo 

    If obj Is Nothing Then Return 1 
    If Me.Score > DirectCast(obj, SortableObject).Score Then Return 1 
    If Me.Score < DirectCast(obj, SortableObject).Score Then Return -1 

    Return 0 

    End Function 

下面是这种种由低到高实现IComparable对象的一个​​简单的例子。

Module Module1 

    Sub Main() 
     Dim sortableObjects = New List(Of SortableObject) From 
           {New SortableObject With {.Score = 12}, 
           New SortableObject With {.Score = 5}, 
           New SortableObject With {.Score = 120}, 
           New SortableObject With {.Score = 99}} 

     sortableObjects.Sort() // 5, 9, 99, 120 
    End Sub 
End Module 

Public Class SortableObject : Implements IComparable 
    Public Property Score As Integer 

    Public Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo 

    If obj Is Nothing Then Return 1 
    If Me.Score > DirectCast(obj, SortableObject).Score Then Return 1 
    If Me.Score < DirectCast(obj, SortableObject).Score Then Return -1 

    Return 0 
    // Edit: Or as Konrad mentioned, Return (Me.Score.CompareTo(DirectCast(obj, SortableObject).Score)). This sorts the items in ascending order. 

    End Function 
End Class 
0

除了什么汉斯在评论(!您需要实现通用接口),也有对码两件事情说这让我畏缩:

  1. 使用DirectCast代替CType 。后者是一个通用的演员,并不能很好地显示这里实际做了什么。 DirectCast只允许某些演员发生,特别是没有转换。这是适当的,因为你不转换。

  2. 整个CompareTo方法可以缩短到一个单一的线:

    Return Score.CompareTo(OtherItem.Score)