1

行ったフィード検索の検索結果を保存するオブジェクトのリストがあります。リストに追加するときに、結果がどの程度関連しているかについてオブジェクトにスコアを付けて、これらの結果を一番上にプッシュできるようにします。

私のオブジェクトは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
4

2 に答える 2

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
于 2012-07-20T11:54:39.120 に答える
0

ハンスがコメントで言ったこと(ジェネリックインターフェイスを実装する必要があります!)とは別に、コードには2つのことがあります。

  1. DirectCastの代わりに使用してくださいCType。後者は汎用キャストであり、ここで実際に行われていることをあまりよく示していません。DirectCast特定のキャストのみが発生し、特に変換は許可されません。変換しないので、ここが適切です。

  2. メソッド全体CompareToを1行に短縮できます。

    Return Score.CompareTo(OtherItem.Score)
    
于 2012-07-20T11:56:09.747 に答える