从VB.NET中的列表(T)中删除重复项

从VB.NET中的列表(T)中删除重复项,.net,vb.net,generics,.net,Vb.net,Generics,我无法从列表中删除重复项。我做错了什么 Dim Contacts As New List(Of Person) ... ' remove duplicates ' Contacts = Contacts.Distinct(New PersonEqualityComparer).ToList 我的平等比较器: Public Class PersonEqualityComparer Implements IEqualityComparer(Of Person) Public F

我无法从列表中删除重复项。我做错了什么

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

您需要实现
GetHashCode1
,以便任意两个相等的对象具有相同的hashcode

如果许多不相等的对象具有相同的哈希代码,则执行速度会慢得多,尤其是对于大型列表。换句话说,不要将其更改为
返回0

在您的情况下,最简单的实现如下所示:

Return StringComparer.CurrentCultureIgnoreCase.GetHashCode(obj.EmailAddress) _
   Xor StringComparer.CurrentCultureIgnoreCase.GetHashCode(obj.GivenName) _
   Xor StringComparer.CurrentCultureIgnoreCase.GetHashCode(obj.Surname)
如果需要更健壮的实现,请参阅

它当然比xor方法或滚动您自己的适当哈希函数要慢。
但是,如果由于xoring而导致冲突率很高,您可以尝试使用此选项。

我没有注意到您在不敏感地比较大小写。你必须使用我更新的答案;原件区分大小写。
StringBuilder sb as New StringBuilder
...concatenate all strings...
return StringComparer.CurrentCultureIgnoreCase.GetHashCode(sb.ToString())