/ / Rimuovi i duplicati da un elenco (di T) in VB.NET - .net, vb.net, generics

Rimuovere i duplicati da un elenco (di T) in VB.NET - .net, vb.net, generics

Non riesco a rimuovere i duplicati dalla mia lista. Che cosa sto facendo di sbagliato?

Dim Contacts As New List(Of Person)

...

" remove duplicates "
Contacts = Contacts.Distinct(New PersonEqualityComparer).ToList

il mio comparatore di uguaglianza:

Public Class PersonEqualityComparer
Implements IEqualityComparer(Of Person)
Public Function Equals1(ByVal x As Person, ByVal y As Person) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of Person).Equals
Return String.Equals(x.EmailAddress, y.EmailAddress, StringComparison.CurrentCultureIgnoreCase) AndAlso _
String.Equals(x.GivenName, y.GivenName, StringComparison.CurrentCultureIgnoreCase) AndAlso _
String.Equals(x.Surname, y.Surname, StringComparison.CurrentCultureIgnoreCase)
End Function
Public Function GetHashCode1(ByVal obj As Person) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Person).GetHashCode
Return obj.GetHashCode
End Function
End Class

risposte:

4 per risposta № 1

Devi implementare GetHashCode1 in modo che qualsiasi due oggetti uguali abbiano lo stesso codice hash.

Se molti oggetti non uguali hanno lo stesso codice hash, eseguirà molto più lentamente, specialmente per elenchi di grandi dimensioni. In altre parole, non cambiarlo Return 0.

Nel tuo caso, l'implementazione più semplice sarebbe come questa:

Return StringComparer.CurrentCultureIgnoreCase.GetHashCode(obj.EmailAddress) _
Xor StringComparer.CurrentCultureIgnoreCase.GetHashCode(obj.GivenName) _
Xor StringComparer.CurrentCultureIgnoreCase.GetHashCode(obj.Surname)

Se vuoi un'implementazione più solida, vedi questa risposta.


1 per risposta № 2
StringBuilder sb as New StringBuilder
...concatenate all strings...
return StringComparer.CurrentCultureIgnoreCase.GetHashCode(sb.ToString())

È certamente più lento del xor metodo o rotolare la propria funzione di hash corretta. Si può provare a usare questo, tuttavia, se si hanno alti tassi di collisione a causa di xoring.