Vb.net 创建共享的IEqualityComparer
我正在做一些需要自定义比较器的LINQ,因此我创建了一个实现Vb.net 创建共享的IEqualityComparer,vb.net,interface,static-methods,Vb.net,Interface,Static Methods,我正在做一些需要自定义比较器的LINQ,因此我创建了一个实现IEqualityComparer的新类。但是,当我使用它时,每次都必须创建一个实例 Dim oldListOnly = oldList.Except(newList, New MyEqualityComparer) Dim newListOnly = newList.Except(oldList, New MyEqualityComparer) 我可能误解了.NET的工作原理,但每次创建一个新的比较器似乎都是浪费。我真的只需要一个实
IEqualityComparer
的新类。但是,当我使用它时,每次都必须创建一个实例
Dim oldListOnly = oldList.Except(newList, New MyEqualityComparer)
Dim newListOnly = newList.Except(oldList, New MyEqualityComparer)
我可能误解了.NET的工作原理,但每次创建一个新的比较器似乎都是浪费。我真的只需要一个实例(相当于C++/C#中的static)
所以我试着创建一个“静态”类,它。但在模块中得到了一个“Implements”无效的错误
然后,我尝试在我的类上使Equals和GetHashCode函数共享方法,但出现以下错误:实现接口成员的方法不能声明为“共享”。
有什么办法可以实现我的目标吗?还是我只是误解了幕后的情况?为什么不干脆这么做呢
Dim comparer = New MyEqualityComparer
Dim oldListOnly = oldList.Except(newList, comparer )
Dim newListOnly = newList.Except(oldList, comparer )
您的理解是正确的,尽管浪费不太可能明显。对于您的情况,您可以使用singleton模式,它通常是这样的:
Public Class MyEqualityComparer
Implements IEqualityComparer(Of whatever)
Private Sub New()
'no outsider creation
End Sub
Private Shared ReadOnly _instance As New MyEqualityComparer()
Public Shared ReadOnly Property Instance As MyEqualityComparer
Get
Return _instance
End Get
End Property
'other code
End Class
需要有一个具体类型的实例来实现
IEqualityComparer
。但是,您可以使用模块定义一个公共实例,该实例被初始化为“New EqualityComparer”。然后可以将该默认实例传递给Except方法
比如:
Public Module MyComparer
Public acmeComparer As acmeCompareType
Public Class acmeCompareType
Implements IEqualityComparer(Of System.Drawing.Point)
Public Function Equals1(x As System.Drawing.Point, y As System.Drawing.Point) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of System.Drawing.Point).Equals
Return Math.Abs(x.X) = Math.Abs(y.X) AndAlso Math.Abs(x.Y) = Math.Abs(y.Y)
End Function
Public Function GetHashCode1(obj As System.Drawing.Point) As Integer Implements System.Collections.Generic.IEqualityComparer(Of System.Drawing.Point).GetHashCode
' Note that obj is a struct passed by value, so we can safely modify it here
' (without affecting the caller's instance)
obj.X = Math.Abs(obj.X)
obj.Y = Math.Abs(obj.Y)
Return obj.GetHashCode
End Function
End Class
End Module
公共模块MyComparer
作为acmeCompareType的公共acmeComparer
公共类acmeCompareType
实现(System.Drawing.Point的)IEqualityComparer
公共函数Equals1(x为System.Drawing.Point,y为System.Drawing.Point)作为布尔值实现System.Collections.Generic.IEqualityComparer(属于System.Drawing.Point)。等于
返回Math.Abs(x.x)=Math.Abs(y.x)和also Math.Abs(x.y)=Math.Abs(y.y)
端函数
公共函数GetHashCode1(obj作为System.Drawing.Point)作为整数实现System.Collections.Generic.IEqualityComparer(属于System.Drawing.Point)。GetHashCode
'注意obj是一个按值传递的结构,因此我们可以在这里安全地修改它
'(不影响调用方的实例)
obj.X=数学Abs(obj.X)
obj.Y=数学Abs(obj.Y)
返回obj.GetHashCode
端函数
末级
端模块
的确这是我提出的最好的解决方案(尽管我正在考虑将它作为我正在使用它的类的私有成员)。然而,我仍然好奇,共享的IEqualityComparer是否在某种程度上是可能的,如果不是,为什么不呢。我最终选择了这个,因为我有多个比较器。。。把他们都分成一个模块效果很好。