【问题标题】:Remove duplicates from a List(Of T) in VB.NET从 VB.NET 中的 List(Of T) 中删除重复项
【发布时间】:2010-02-23 22:18:57
【问题描述】:

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

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

【问题讨论】:

    标签: .net vb.net generics


    【解决方案1】:

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

    如果许多不相等的对象具有相同的哈希码,它将执行得更慢,尤其是对于大型列表。也就是说,不要改成Return 0

    在你的情况下,最简单的实现是这样的:

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

    如果您想要更健壮的实现,请参阅this answer

    【讨论】:

    • 我没有注意到您在比较不区分大小写。您必须使用我更新的答案;原件区分大小写。
    【解决方案2】:
    StringBuilder sb as New StringBuilder
    ...concatenate all strings...
    return StringComparer.CurrentCultureIgnoreCase.GetHashCode(sb.ToString())
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多