Amine Tagui
Amine Tagui

Reputation: 335

Delete duplicates from list

I have the following class :

Public Class titlesclass
Public Property Link As String
Public Property Title As String

Public Function Clear()
    Link.Distinct().ToArray()
    Title.Distinct().ToArray()

End Function
End Class

And the following code :

For Each title As Match In (New Regex(pattern).Matches(content)) 'Since you are only pulling a few strings, I thought a regex would be better.
            Dim letitre As New titlesclass
            letitre.Link = title.Groups("Data").Value
            letitre.Title = title.Groups("Dataa").Value
            lestitres.Add(letitre)
            'tempTitles2.Add(title.Groups("Dataa").Value)
        Next

I tried to delete the duplicated strings using the simple way

Dim titles2 = lestitres.Distinct().ToArray()

And calling the class function :

lestitres.Clear()

But the both propositions didn't work , i know that i'm missing something very simple but still can't find what it is

Upvotes: 0

Views: 1147

Answers (2)

user1234433222
user1234433222

Reputation: 996

Ok, Since I notice you are using a Class
Here is one option you can do in order to not add duplicate items to your List within a class.

I'm using a console Application to write this example, it shouldn't be too hard to understand and convert to a Windows Form Application if need be.

Module Module1

Sub Main()
    Dim titlesClass = New Titles_Class()
    titlesClass.addNewTitle("myTitle") ''adds successfully
    titlesClass.addNewTitle("myTitle") '' doesn't add
End Sub

Public Class Titles_Class
    Private Property Title() As String
    Private Property TitleArray() As List(Of String)

    Public Sub New()
        TitleArray = New List(Of String)()
    End Sub

    Public Sub addNewTitle(title As String)
        Dim added = False
        If Not taken(title) Then
            Me.TitleArray.Add(title)
            added = True
        End If
        Console.WriteLine(String.Format("{0}", If(added, $"{title} has been added", $"{title} already exists")))
    End Sub

    Private Function taken(item As String) As Boolean
        Dim foundItem As Boolean = False
        If Not String.IsNullOrEmpty(item) Then
            foundItem = Me.TitleArray.Any(Function(c) -1 < c.IndexOf(item))
        End If
        Return foundItem
    End Function

End Class
End Module


Another option would be to use a HashSet, It will never add a duplicate item, so even if you add an item with the same value, it wont add it and wont throw an error

    Sub Main()
    Dim titlesClass = New HashSet(Of String)
    titlesClass.Add("myTitle") ''adds successfully
    titlesClass.Add("myTitle") '' doesn't add

    For Each title As String In titlesClass
        Console.WriteLine(title)
    Next

End Sub

With all of that aside, have you thought about using a Dictionary so that you could have the title as the key and the link as the value, that would be another way you could not have a list (dictionary) contain duplicate items

Upvotes: 2

Slai
Slai

Reputation: 22876

Easier to use a class that already implements IComparable:

Dim query = From title In Regex.Matches(content, pattern).Cast(Of Match)
            Select Tuple.Create(title.Groups("Data").Value, title.Groups("Dataa").Value)

For Each letitre In query.Distinct
    Debug.Print(letitre.Item1 & ", " & letitre.Item2)
Next

or Anonymous Types:

Dim query = From title In Regex.Matches(content, pattern).Cast(Of Match)
            Select New With {Key .Link = title.Groups("Data").Value, 
                             Key .Title = title.Groups("Dataa").Value}

For Each letitre In query.Distinct
    Debug.Print(letitre.Link & ", " & letitre.Title)
Next

Upvotes: 2

Related Questions