2014-06-23 2 views
0

나는 CollectionBase에서 상속하는 클래스가 있으며 항목을 추가 할 때 컬렉션에 이미 삽입 될 키가 들어 있는지 여부를 감지하고자합니다. 만약 그렇다면 MsgBox()를 통해 경고를 보내려고합니다. 여기에 내가 컬렉션이 항목을 이미 가지고 있는지 여부를 확인하려고 추가 방법에서 VB.Net은 컬렉션의 기존 키를 확인합니다

<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 

을 시도했다 코드 &입니다. 하지만 항상 -1을 반환합니다. 여기

컬렉션에 새 항목을 추가하는 코드입니다

Textbox1.validation.Add(New validationItem With {.Key = validationItem.validationTypes.man, .Value = "1"}) 
당신은 존재하는 경우 그냥 키가 존재하는지 여부를 확인 여부 만 표시해야합니다
+0

나는 이전 질문에 제공된 대답에 따라 이것을 만들었다. 그리고 그 대답을 한 회원은 내가 더 잘했다고 언급했다. 이 컬렉션은 디자이너가 속성을 통해 노출되어 있기 때문에 사전을 불러야합니다. – codeGEN

답변

-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 

로를 그것은 단지 메서드의 결과를 Boolean (따라서 -1)

+0

코드를 통해 항목을 추가하기 전에 이미 "man"키가있는 항목이 있지만 여전히 -1을 반환합니다. If 조건이 있어야한다는 것을 알고 있습니다. 반환 값을보기 위해 메시지 상자를 추가했습니다. – codeGEN

2

의 결과를 반환하는 것을 나타냅니다.(T의)을 IEquatable의 객체의 구현에 의해 정의 된

이 방법, 기본 같음 비교를 사용하여 평등을 결정 :작업, 당신은 validationItemEquals/GetHashCode을 구현하거나 IEquatable(Of T) interface 구현해야합니다. T (목록에있는 값의 유형)에 대한 메소드와 같습니다. 여기

은 모두, KeyValue 확인 Equals/ GetHashCode에 대한 구현 한 예이다 :

또한 사용 LINQ를 사용할 수
<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 

가 여기에 예제가 그 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 
+0

IEquatable (Of T)를 사용하려고했는데 이유가 무엇인지 잘 모르겠다는 잘못된 반응을 보입니다. 나는 여기에 새로운 질문을 게시 http://stackoverflow.com/questions/24362981/vb-net-check-for-duplicate-items-in-a-collection-base .. Introducting IEquatable (Of T)에 대한 Upvoted. – codeGEN

관련 문제