VB.Net检查集合中的现有密钥

时间:2014-06-23 06:13:07

标签: vb.net user-controls

我有一个继承自CollectionBase的类,并且在添加项目时我想检测该集合是否已包含要插入的键。如果是的话我想通过MsgBox()发送警告。这是代码&我试过的是什么

<Serializable()> Public Class validationList
    Inherits CollectionBase

    Public Function Add(ByVal Item As validationItem) As Integer
        MsgBox(Me.List.Contains(Item))
        Return Me.List.Add(Item)
    End Function

    Default Public ReadOnly Property Item(ByVal index As Integer) As validationItem
        Get
            Return CType(List.Item(index), validationItem)
        End Get
    End Property

    Public Sub Remove(ByVal index As Integer)
        Me.List.RemoveAt(index)
    End Sub

    Public Function IndexOf(ByVal key As validationItem)
        Return List.IndexOf(key)
    End Function

    Public Sub AddRange(ByVal item() As validationItem)
        For counter As Integer = 0 To item.GetLength(0) - 1
            List.Add(item(counter))
        Next
    End Sub
End Class

<Serializable()> Public Class validationItem
    Private _key As validationTypes
    Private _value As String

    Public Enum validationTypes
        man = 0
        num = 1
    End Enum

    Public Property Value As String
        Get
            Return _value
        End Get
        Set(ByVal Value As String)
            _value = Value
        End Set
    End Property

    Public Property Key As validationTypes
        Get
            Return _key
        End Get
        Set(ByVal value As validationTypes)
            _key = value
        End Set
    End Property

    Public Sub New()
        ' Empty constructor is needed for serialization
    End Sub

    Public Sub New(ByVal k As validationTypes, ByVal v As String)
        _key = k
        _value = v
    End Sub
End Class

Public Class textbox
    Inherits System.Windows.Forms.TextBox
    Private _validation As New validationList

    <System.ComponentModel.DesignerSerializationVisibility(Content)>
    Public Property validation As validationList
        Get
            Return _validation
        End Get
        Set(ByVal value As validationList)
            _validation = value
        End Set
    End Property
End Class

在add方法中,我试图检查集合是否已经有这个项目。但它始终返回-1

以下是将新项目添加到集合

的代码
Textbox1.validation.Add(New validationItem With {.Key = validationItem.validationTypes.man, .Value = "1"})

2 个答案:

答案 0 :(得分:2)

要使Contains有效,您必须在Equals上实施GetHashCode / validationItem或实施IEquatable(Of T) interface

  

此方法通过使用默认的相等比较器来确定相等性,该默认的相等比较器由对象的T的IEquatable(Of T).Equals方法的实现(列表中的值的类型)定义。

以下Equals / GetHashCode的示例实施,同时检查KeyValue

<Serializable> _
Public Class validationItem

    Protected Overloads Function Equals(other As validationItem) As Boolean
        Return _value = other._value AndAlso _key = other._key
    End Function

    Public Overrides Function Equals(obj As Object) As Boolean
        If obj Is Nothing Then
            Return False
        End If
        If Me Is obj Then
            Return True
        End If
        If obj.GetType() IsNot Me.GetType() Then
            Return False
        End If
        Return Equals(DirectCast(obj, validationItem))
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return ((If(_value IsNot Nothing, _value.GetHashCode(), 0)) * 397) Xor CInt(_key)
    End Function

    ...

End Class

你也可以使用LINQ,这里只是一个只检查Key的例子:

Public Function Add(ByVal Item As validationItem) As Integer
    If Me.List.OfType(Of validationItem).Any(Function(i) i.Key = Item.Key) Then
        ' Do something '
    Else
        Return Me.List.Add(Item)
    End If
End Function

答案 1 :(得分:-1)

您只需要检查密钥是否存在,只显示密钥是否存在:

Public Function Add(ByVal Item As validationItem) As Integer
    If Me.List.Contains(Item) Then MsgBox("The key already exists")
    Return Me.List.Add(Item)
End Function

就目前而言,您只是返回Contains方法的结果,该结果是Boolean(因此-1