MVC アプリのグリッドにページング データを提供するために、IEnumerable をラップする PagedModel クラスを実装しました。Resharper の自動生成された Equality コードを使用して、データ、合計行、ページ番号、およびページ サイズ フィールドをチェックするように指示しました。クラスコードは次のとおりです。
Public Class PagedModel(Of T)
Public Property PageSize As Integer
Public Property PageNumber As Integer
Public Property ModelData As IEnumerable(Of T)
Public Property TotalRecords As Integer
Public Overloads Function Equals(ByVal other As PagedModel(Of T)) As Boolean
If ReferenceEquals(Nothing, other) Then Return False
If ReferenceEquals(Me, other) Then Return True
Return other._PageSize = _PageSize AndAlso other._PageNumber = _PageNumber AndAlso Equals(other._ModelData, _ModelData) AndAlso other._TotalRecords = _TotalRecords
End Function
Public Overloads Overrides Function Equals(ByVal obj As Object) As Boolean
If ReferenceEquals(Nothing, obj) Then Return False
If ReferenceEquals(Me, obj) Then Return True
If Not Equals(obj.GetType(), GetType(PagedModel(Of T))) Then Return False
Return Equals(DirectCast(obj, PagedModel(Of T)))
End Function
Public Overrides Function GetHashCode() As Integer
Dim hashCode As Long = _PageSize
hashCode = CInt((hashCode * 397) Xor _PageNumber Mod Integer.MaxValue)
If _ModelData IsNot Nothing Then hashCode = CInt(((hashCode * 397) Xor _ModelData.GetHashCode()) Mod Integer.MaxValue)
hashCode = CInt((hashCode * 397) Xor _TotalRecords Mod Integer.MaxValue)
Return CInt(hashCode Mod Integer.MaxValue)
End Function
End Class
私の知る限り、Equals(other._ModelData, _ModelData) への呼び出しは独特であることがわかりました。これは、含まれているアイテムが同じであることではなく、同じオブジェクトであることを確認します。とにかくテストが失敗していたので、先に進み、それを other._ModelData.Equals(_ModelData) に変更しましたが、成功しませんでした。次に、デバッグ時に反映したところ、other._ModelData.GetType().GetMethod("Equals",{GetType(Object)}).DeclaringType が Object であることがわかりました。明らかに、それは失敗した比較になります。
2 つの列挙型のすべての項目を比較して同じであることを確認する EnumerableEquals メソッドを作成するソリューションを思いつきましたが、ずさんなようです。通常の .Equals メソッドを使用するためにできることはありますか?
Private Function EnumerableAreEqual(ByVal a As IEnumerable(Of T), ByVal b As IEnumerable(Of T)) As Boolean
b = b.ToList() 'avoid multiple query execution
Return a.All(Function(item) b.Contains(item))
End Function