在VB中实现通用IComparer

时间:2012-06-17 09:02:52

标签: vb.net generics icomparer

我正在尝试创建一个实现我自己的类“Stellungen”的通用IComparer的类(它转换为位置,就像在国际象棋或棋盘上)。

这就是我得到的:

Private Class comparer(Of Stellung)
    Implements System.Collections.Generic.IComparer(Of Stellung)

    Public Function Compare(x As Stellung, y As Stellung) As Integer Implements System.Collections.Generic.IComparer(Of Stellung).Compare

    End Function

End Class

问题是:在函数内部,我无法访问我班级的任何字段。如果我从x开始。 Intellisense只会给我.Equals,。GetHashCode - 你在类型上获得但不在实例上的方法。 Visual Studio 10也很高,在函数的定义中,位“x as Stellung”和“y as Stellung”是用浅蓝色写的,这意味着它是一种类型,而不是一个实际的对象。

所以......我该怎么办?如何在课堂上访问我想要比较的内容? 谢谢!

2 个答案:

答案 0 :(得分:2)

字段可能是私有的,这就是您无法访问它们的原因。 让你的类实现IComparable<T>接口。您可以在比较器类中使用它 下面是一个通用比较器类的示例,它比较实现IComparable<T>的对象。

Public Class GenericComparer(Of T As IComparable(Of T))
    Inherits Comparer(Of T)

    Public Overrides Function [Compare](ByVal x As T, ByVal y As T) As Integer
        If (Not x Is Nothing) Then
            If (Not y Is Nothing) Then
                Return x.CompareTo(y)
            End If
            Return 1
        End If
        If (Not y Is Nothing) Then
            Return -1
        End If
        Return 0
    End Function

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Dim comparer As GenericComparer(Of T) = TryCast(obj,GenericComparer(Of T))
        Return (Not comparer Is Nothing)
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return MyBase.GetType.Name.GetHashCode
    End Function

End Class


public class Stellung
   Implements IComparable(Of Stellung)

   Public Function CompareTo(ByVal value As Stellung) As Integer
       'Here you should be able to access all fields. 
   End Function
End class

答案 1 :(得分:1)

如果您声明Private Class comparer(Of Stellung),则“ Stellung”仅是要使用的类型的占位符(如本教程中的“ T”)。

声明Private Class comparerImplements System.Collections.Generic.IComparer(Of Stellung)告诉编译器您要比较类型为“ Stellung”的对象,这使Stellung的属性在编辑器中可见。