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