我正在尝试创建一个实现我自己的类“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”是用浅蓝色写的,这意味着它是一种类型,而不是一个实际的对象。
所以......我该怎么办?如何在课堂上访问我想要比较的内容? 谢谢!
答案 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 comparer
和Implements System.Collections.Generic.IComparer(Of Stellung)
告诉编译器您要比较类型为“ Stellung”的对象,这使Stellung的属性在编辑器中可见。