Vb.net 创建共享的IEqualityComparer

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的工作原理,但每次创建一个新的比较器似乎都是浪费。我真的只需要一个实

我正在做一些需要自定义比较器的LINQ,因此我创建了一个实现
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是否在某种程度上是可能的,如果不是,为什么不呢。我最终选择了这个,因为我有多个比较器。。。把他们都分成一个模块效果很好。