.netvb.netlistgenericsgeneric-collections

vb.net list<T> if not exist add


I have a List

    Public Class Connoisseur
                Public Name As String
                Public Pieces As String
    End Class


Private Sub Button26_Click(sender As Object, e As RibbonControlEventArgs) Handles Button26.Click
    Dim CS As New List(Of Connoisseur)()
End Sub

How to use generics Write an IFNotExistsAdd function

CS = {"test1","2"}

It looks like this

CS.IFNotExistsAdd(New Connoisseur() With{.Name="test1",.Pieces="1"}) 'This line will not be added because CS.Name already contains "test1"
CS.IFNotExistsAdd(New Connoisseur() With{.Name="test2",.Pieces="1"})

The output looks like this

Output:

{"test1","2"}
{"test2","1"}

Solution

  • You're question is not entirely clear. IFNotExistsAdd is not a valid method name for a List, so you have to create an extension method.

    Create a Module (using the same namespace as the calling class)

    Module Extensions
    
    <Extension>
    Public Sub IFNotExistsAdd(Of T)(list As List(Of T), item As T)
        If Not list.Any(Function(x) x.Equals(item)) Then
            list.Add(item)
        End If
    End Sub
    
    End Module
    

    Then you need to add an Equals override to the class (I've also added an initialiser for the properties)

    Public Class Connoisseur
    
    Public Name As String
    Public Pieces As String
    
    Public Sub New(name As String, pieces As String)
        Me.Name = name
        Me.Pieces = pieces
    End Sub
    
    Public Overrides Function Equals(obj As Object) As Boolean
        If TypeOf obj Is Connoisseur Then
            Return EqualsItem(CType(obj, Connoisseur))
        Else
            Return False
        End If
    End Function
    
    Public Function EqualsItem(obj As Connoisseur) As Boolean
        Return obj.Name = Me.Name And obj.Pieces = Me.Pieces
    End Function
    
    End Class
    

    You can then run add items to the list and it will only add those that are unique

    CS.IFNotExistsAdd(New Connoisseur("test1", 1))
    CS.IFNotExistsAdd(New Connoisseur("test1", 1))
    CS.IFNotExistsAdd(New Connoisseur("test2", 2))
    

    This will only add test1 and test2.