.IndexOf函数在vb.net中为类的List返回负数

时间:2013-03-30 23:39:13

标签: vb.net list class object

我一直没有使用类结构列表的麻烦 - 我一直在尝试在控制台中创建一个字典。列表中的每个元素都有四个属性:.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要简单得多。

有没有人对出了什么问题有任何建议?提前谢谢!

2 个答案:

答案 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 _
)