实现IEquatable获取不同的对象

时间:2015-10-03 04:40:33

标签: vb.net distinct-values

这对我不起作用。在花了太多时间之后,我无法在MSDN或其他地方找到答案。我错过了什么?

Public Class PrinterInfo
    Implements IEquatable(Of PrinterInfo)
    Public PrinterName As String
    Public PrinterDesc As String

    'default equality comparer for class vb.net
    Public Overloads Function Equals(ByVal other As PrinterInfo) As Boolean _
       Implements IEquatable(Of PrinterInfo).Equals
        Return other.PrinterName = Me.PrinterName
    End Function

End Class

Public ReadOnly Property PrinterInfoList(ByVal Normal As NormalCopier) As List(Of PrinterInfo)
    Get
        Dim pList1 As List(Of PrinterInfo) = GetList
        pList1.Sort()
        Return pList1.Distinct.ToList
    End Get
End Property

我得到的列表很好,但我只想要不同的项目。我试图实现一个相等比较器,但它不起作用。我有多个副本。我需要做什么才能获得不同的值?

MSDN: Enumerable.Distinct(Of TSource)

MSDN: IEqualityComparer(Of T) Interface

This seems similar but I don't understand it

如果可以,我想避开Linq GroupBy。这对我来说似乎很笨拙。

1 个答案:

答案 0 :(得分:1)

Enumerable.Distinct(Of Source)的文档说:

  

默认的相等比较器Default用于比较实现IEquatable<T>通用接口的类型的值。要比较自定义数据类型,您需要实现此界面 ,并为该类型提供您自己的GetHashCode Equals方法。

那是你缺少的部分。您应该在班级中提供GetHashCode()实施。如果你看一下给出的代码示例,你也会看到它。当你想到它时,它是有道理的。 Distinct的实现在内部使用哈希集,因此自然需要正确的GetHashCode实现才能正常运行。

在您的情况下,请尝试将其添加到PrinterInfo课程中:

Public Overrides Function GetHashCode() As Integer
    Return Me.PrinterName.GetHashCode()
End Function