gpt4 book ai didi

.net - IEnumerable.Equals 似乎调用了错误的 Equals 方法

转载 作者:行者123 更新时间:2023-12-02 00:34:10 27 4
gpt4 key购买 nike

我实现了一个 PagedModel 类来包装 IEnumerable,为我的 MVC 应用程序中的网格提供分页数据。我使用 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) 但没有成功。然后我在调试时反射(reflect)到它,发现 other._ModelData.GetType().GetMethod("Equals",{GetType(Object)}).DeclaringType 是 Object!显然,这会导致比较失败。

我想出了一个解决方案来创建一个 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

最佳答案

您可能想使用 SequenceEqual .

(new[]{1,2,3}).SequenceEqual(new[]{1,2,3}) // True
(new[]{1,2,3}).SequenceEqual(new[]{3,2,1}) // False
(new[]{1,2,3}).SequenceEqual(new[]{1,2}) // False
(new[]{1,2}).SequenceEqual(new[]{1,2,3}) // False

这将确保两个 IEnumerable 具有相同顺序的相同元素。

关于.net - IEnumerable.Equals 似乎调用了错误的 Equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727606/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com