/ / Видаліть дублікати зі списку (з T) у VB.NET - .net, vb.net, generics

Видаліть дублікати з списку (з T) в VB.NET - .net, vb.net, генериках

Я не можу видалити дублікати зі свого списку. Що я роблю неправильно?

Dim Contacts As New List(Of Person)

...

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

мій порівняння рівності:

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

Відповіді:

4 для відповіді № 1

Вам потрібно реалізувати GetHashCode1 так що будь-які два рівні об’єкти мають однаковий хеш-код.

Якщо багато неоднакових об’єктів мають однаковий хеш-код, він виконуватиметься набагато повільніше, особливо для великих списків. Іншими словами, не змінюйте це на Return 0.

У вашому випадку найпростішою реалізацією було б таке:

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

Якщо ви хочете більш надійної реалізації, див ця відповідь.


1 для відповіді № 2
StringBuilder sb as New StringBuilder
...concatenate all strings...
return StringComparer.CurrentCultureIgnoreCase.GetHashCode(sb.ToString())

Це, звичайно, повільніше, ніж xor метод або прокатка власної належної хеш-функції. Ви можете спробувати скористатися цим, якщо у вас високий коефіцієнт зіткнення через xoring.