2

オブジェクトの 2 つのリストを含むコードがあります。最初のリストは、2 番目のリストよりも包括的です。最初のリストから 2 番目のリストの項目を除外したいと考えています。いくつかの調査の後、拡張メソッドExceptがこれを行う方法であることがわかりました。そのため、次のようなコードを実装IEquatable(Of T)しました。IEqualityComparer(Of T)

Partial Public Class CustomerData
    Implements IEquatable(Of CustomerData)
    Implements IEqualityComparer(Of CustomerData)

    Public Overloads Function Equals(other As CustomerData) As Boolean Implements IEquatable(Of ToolData.CustomerData).Equals
        If other Is Nothing Then
            Return False
        Else
            Return Me.CustomerID = other.CustomerID
        End If
    End Function

    Public Overloads Function Equals(this As CustomerData, that As CustomerData) As Boolean Implements IEqualityComparer(Of ToolData.CustomerData).Equals
        If this Is Nothing OrElse that Is Nothing Then
            Return False
        Else
            Return this.CustomerID = that.CustomerID
        End If
    End Function

    Public Overloads Function GetHashCode(other As CustomerData) As Integer Implements IEqualityComparer(Of ToolData.CustomerData).GetHashCode
        If other Is Nothing Then
            Return CType(0, Integer).GetHashCode
        Else
            Return other.CustomerID.GetHashCode
        End If
    End Function

次に、次のような簡単な呼び出しを行います。

customerCollection = CustomerData.LocalCustomers.Except(CustomerData.RecentCustomers).OrderBy(Function(x) x.FullName).ToList

これはうまくいきません。これもありません:

customerCollection = CustomerData.LocalCustomers.Except(CustomerData.RecentCustomers, EqualityComparer(Of CustomerData).Default).OrderBy(Function(x) x.FullName).ToList

ただし、これは機能します。

customerCollection = CustomerData.LocalCustomers.Except(CustomerData.RecentCustomers, New CustomerData).OrderBy(Function(x) x.FullName).ToList

RecentCustomersLocalCustomersが両方ともあるのでList(Of CustomerData)、デフォルトの比較メソッドが機能しないのはなぜですか? うまくいかないというのは、EqualsとのGetHashCodeルーチンにブレーク ポイントを入れることができ、それらがヒットすることはなく、返されるリストが のリストと同じであることを意味しますLocalCustomers

4

1 に答える 1

3

IEqualityComparer(Of T)まず、インターフェイスを実装する必要はありません。同じクラスに複数のタイプの同等性を提供したい場合は、通常、別のクラスでそれを実装します。

GetHashCode次に、メソッドとEquals(Object)メソッドをオーバーライドする必要があります。

Partial Public Class CustomerData
   Implements IEquatable(Of CustomerData)

   Public Override Function GetHashCode() As Integer
      Return CustomerID.GetHashCode()
   End Function

   Public Override Function Equals(ByVal obj As Object)
      Return Equals(TryCast(obj, CustomerData))
   End Function

   Public Overloads Function Equals(other As CustomerData) As Boolean Implements IEquatable(Of ToolData.CustomerData).Equals
      If other Is Nothing Then
         Return False
      Else
         Return Me.CustomerID = other.CustomerID
      End If
   End Function

   ...

理由を説明するブログ投稿は次のとおりです 。 s-equals-and-gethashcode.aspx

于 2012-11-13T17:50:43.100 に答える