6

LINQ コレクションで使用する単純な IEqulityComparer を実装しようとしています。私は次のコードを作成しましたが、これは議論のために最も単純な形式に縮小されています...

Public Structure bob
    Dim SiteID As Integer
    Dim fred As String
End Structure

Public Class insCompare
    Implements System.Collections.Generic.IEqualityComparer(Of bob)

    Public Function Equals(ByVal x As bob, ByVal y As bob) As Boolean
        Return IIf(x.SiteID = y.SiteID, True, False)

    End Function

    Public Function GetHashCode(ByVal x As bob) As Integer
        Return x.SiteID.GetHashCode()

    End Function

End Class

私が抱えている問題は、両方の関数がコンパイラ警告をスローすることです「関数 'getHashCode' (または 'Equals') は、基本クラス 'Object' のオーバーライド可能なメソッドをシャドウします。基本クラスのメソッドをオーバーライドするには、このメソッドを 'Overrides と宣言する必要があります。 '."

ただし、それらをオーバーライドとして宣言すると、「関数 'GetHashCode' は基本クラスの関数をオーバーライドしないため、オーバーライドとして宣言できません。」というエラーが表示されます。

また、「Implements」行で「getHashCode」を実装する必要があるというコンパイラ エラーが発生していますが、これは最初の問題の結果であると推測しています。

私のすべての調査は、私が大丈夫であることを示しています - 誰か手がかりを教えてください?

4

4 に答える 4

5

これは質問に対する遅い回答ですが、ドキュメントに従って、以下を使用できます。Overloadsキーワードが含まれていることに注意してください。

Public Class MyModelComparer
    Implements Generic.IEqualityComparer(Of MyModel)

    Public Overloads Function Equals(x As MyModel, y As MyModel) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of MyModel).Equals
       ' do compare
    End Function

    Public Overloads Function GetHashCode(obj As MyModel) As Integer Implements System.Collections.Generic.IEqualityComparer(Of MyModel).GetHashCode
       ' do hashcode
    End Function

End Class
于 2012-09-19T19:50:19.850 に答える
1

わかりました、関数の名前を変更して「実装」として宣言することでソートされるようですが、そうでない例を Web で何十も見てきました。ただし、個別に投稿するランタイム例外が発生しました。

Public Class insCompare
    Implements System.Collections.Generic.IEqualityComparer(Of Object)

    Public Function Equals1(ByVal x As Object, ByVal y As Object) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of Object).Equals
        Return IIf(x.SiteID = y.SiteID, True, False)

    End Function

    Public Function GetHashCode1(ByVal x As Object) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Object).GetHashCode
        Return x.SiteID.ToString.ToLower.GetHashCode()

    End Function

End Class
于 2009-06-17T12:13:23.807 に答える
1

私は同じ問題を抱えています。C# コードを VB.Net に変換しています。道具を追加しても役に立ちませんでした。シャドウまたはオーバーロードを使用すると、すべての警告とエラーが削除されます。どちらの場合も、動作の違いは何なのだろうか。Overrides を指定すると、エラーが発生します。(オーバーライド、オーバーロード、シャドウ) のいずれも指定しないと、警告が発生します。

' <summary>
' Pair Comparator for maintaining uniquness in results.
' </summary>
Public Class PairComparer
    Implements IEqualityComparer(Of Pair)
    Public Shadows Function Equals(ByVal x As Pair, ByVal y As Pair) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of Pair).Equals

        If x.first = y.first AndAlso x.second = y.second Then
            Equals = True
        ElseIf x.first = y.second AndAlso x.second = y.first Then
            Equals = True
        Else
            Equals = False
        End If
    End Function

    Public Overloads Function GetHashCode(ByVal obj As Pair) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Pair).GetHashCode
        GetHashCode = obj.first + obj.second
    End Function
End Class
于 2010-10-25T07:46:18.180 に答える
0

C# ではなく VB.NET を使用しているため、コンパイラ エラーが発生します。C# では、実装する必要があるインターフェイス メソッドと同じシグネチャを持つメソッドを使用すると、コンパイラによって自動的に接続されます。

VB.NET では、実装するメソッドを明示的に実装する必要があります。同じ名前を使用できます (推奨されます)。その「implements」句が必要なだけです。

于 2009-06-17T12:29:59.250 に答える