2012-01-20 14 views
2

カスタムコンペアラが必要なLINQをいくつか実行していますので、IEqualityComparerを実装する新しいクラスを作成しました。しかし、私がそれを使うときは、毎回そのインスタンスを作成しなければなりません。共有IEqualityComparerを作成する

Dim oldListOnly = oldList.Except(newList, New MyEqualityComparer) 
Dim newListOnly = newList.Except(oldList, New MyEqualityComparer) 

.NETの仕組みを誤解しているかもしれませんが、毎回新しい比較者を作成するのは無駄です。私は実際には1つのインスタンス(静的と同等のC++/C#)を必要とします。

私は "static"クラスを作成しようとしましたが、それはin vb.net is a moduleです。しかし'Implements' not valid in Modulesエラーが発生しました。

私はその後、私のクラスに等しく、GetHashCodeメソッドの機能共有方法を作ってみましたが、このエラーを得た:Methods that implement interface members cannot be declared 'Shared'.

任意のアイデアをここに私の目標を達成するためにどのように?あるいは、私は単に舞台裏で起こっていることを誤解していますか?廃棄物が顕著になることはほとんどありませんが、単に

Dim comparer = New MyEqualityComparer 
Dim oldListOnly = oldList.Except(newList, comparer) 
Dim newListOnly = newList.Except(oldList, comparer) 

答えて

1

ご理解をしないのはなぜ

1

は、正しいです。あなたの状況について、あなたは通常、このような何かを行くシングルトンパターン、使用することができます

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 
+0

。それは私が思いついた最善の解決策です(しかし、私はそれを私が使っているクラスの私的なメンバーにしようと考えていました)。しかし、私は共有IEqualityComparerが何らかの形で可能であるかどうか不思議です。 –

1

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 
+0

私は複数の比較者を持っているので、これで終わりました...それらをすべて1つのモジュールにグループ化することはうまくいきました。 –

関連する問題