这对我不起作用。在花了太多时间之后,我无法在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。这对我来说似乎很笨拙。
答案 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