代码之家  ›  专栏  ›  技术社区  ›  Zack Peterson

从vb.net中的列表(共t个)中删除重复项

  •  2
  • Zack Peterson  · 技术社区  · 15 年前

    我未能从列表中删除重复项。我做错什么了?

    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 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    7 年前

    你需要实施 GetHashCode1 使任意两个相等的对象具有相同的哈希代码。

    如果许多不同的对象具有相同的哈希代码,那么它的执行速度会慢得多,尤其是对于大型列表。换句话说,不要把它改成 Return 0 .

    在您的例子中,最简单的实现如下:

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

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

        2
  •  1
  •   Andras Vass    15 年前
    StringBuilder sb as New StringBuilder
    ...concatenate all strings...
    return StringComparer.CurrentCultureIgnoreCase.GetHashCode(sb.ToString())
    

    它肯定比 异或 方法或滚动您自己合适的哈希函数。 但是,如果因为XORing而具有较高的冲突率,则可以尝试使用此方法。