我一直没有使用类结构列表的麻烦 - 我一直在尝试在控制台中创建一个字典。列表中的每个元素都有四个属性:.Word,.Definition,.Example和.IsDefined布尔属性。该课程如下:
Class Term
Public Word As String
Public Definition As String
Public Example As String
Public IsDefined As Boolean
End Class
我试图编写的子应该通过查找给定值的索引来更改列表中的值,然后它要求用户输入新数据,然后它应该更改对象。只有它失败了:
IndexPosition = TerminologyDictionary.IndexOf(Term1)
TerminologyDictionary是List(Of Term),Term1是用户要求编辑的术语对象。 TerminologyDictionary中只有一个元素,它的所有四个属性与Term1完全相同。我甚至使用QuickWatch进行了检查,声明......
TerminologyDictionary(0).Word = Term1.Word
TerminologyDictionary(0).Definition = Term1.Definition
TerminologyDictionary(0).Example = Term1.Example
TerminologyDictionary(0).IsDefined = Term1.IsDefined
...所有评估为True,无论我使用Is运算符还是等于。但是当我测试TerminologyDictionary(0)是Term1时,它返回false。
通过使用我自己的函数来遍历列表并手动测试每个属性并在它们全部出现时返回索引,但是它很混乱,我想知道是否有一些简单的我做错了,或者如果有一些方法可以使用.IndexOf。我知道有.FindIndex,但我不了解整个Predicate的事情,.IndexOf要简单得多。
有没有人对出了什么问题有任何建议?提前谢谢!
答案 0 :(得分:3)
默认情况下,IndexOf
仅按引用进行比较,因为您的自定义类未覆盖Equals
。覆盖Equals
时,您应始终覆盖GetHashCode
。
所以这应该有效:
Class Term
Public Word As String
Public Definition As String
Public Example As String
Public IsDefined As Boolean
Public Overrides Function Equals(obj As Object) As Boolean
Dim t2 = TryCast(obj, Term)
If t2 Is Nothing Then Return False
Return Word = t2.Word AndAlso
Definition = t2.Definition AndAlso
Example = t2.Example AndAlso
IsDefined = t2.IsDefined
End Function
Public Overrides Function GetHashCode() As Integer
Dim hash As Integer = 23
hash *= 17 + Word.GetHashCode()
hash *= 17 + Definition.GetHashCode()
hash *= 17 + Example.GetHashCode()
hash *= 17 + IsDefined.GetHashCode()
Return hash
End Function
End Class
编辑:也许这个GetHashCode
的实现更好,因为VB.NET缺少unchecked
:
Public Overrides Function GetHashCode() As Integer
Return New With {Word, Definition, Example, IsDefined}.GetHashCode()
End Function
由于每个GetHashCode
调用需要创建一个匿名类型的实例,因此效率较低。
答案 1 :(得分:1)
IndexOf
方法使用列表中类型的标准比较,对于引用类型,标准比较比较对象的引用,而不是对象属性中的值。
您可以使用FindIndex
方法,如下所示:
IndexPosition = TerminologyDictionary.FindIndex(Function(term As Term) _
Term1.Word = term.Word and _
Term1.Definition = term.Definition and _
Term1.Example = term.Example and _
Term1.IsDefined = term.IsDefined _
)