在VB.NET中从List(Of T)中删除重复项

3

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

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
2个回答

5

您需要实现GetHashCode1,以便任何两个相等的对象具有相同的哈希码。

如果许多不相等的对象具有相同的哈希码,它将执行更慢,特别是对于大型列表。换句话说,不要将其更改为Return 0

在您的情况下,最简单的实现方式如下:

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

如果您想要更强大的实现,请查看这个答案

我没有注意到你是在不区分大小写地比较。你必须使用我的更新答案;原始答案是区分大小写的。 - SLaks

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

它肯定比xor方法或自己编写适当的哈希函数要慢。

如果由于xoring而导致高碰撞率,您可以尝试使用此方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接