我在实现IComparer方法时遇到了麻烦。 基本上,我想比较两个自定义对象的属性(属性是整数类型)。
dE是一个字典(Of String,customObj) prTabIndex是customObj的属性,其类型为Integer (这些适用于所有例子)
经过一些搜索,我找到了this线程,它提出了3个方面:一个List方法,利用LINQ,并使用一些C#3.0功能。但是,在vb中,不确定他们最好的方法是什么。
我尝试了三种不同的方法:
...滚动我自己的IComparer实现:
Public m As Sub(ByRef d As Dictionary(of String, customObj))
Dim sortedD As New SortedDictionary(Of String, customObj)(d, myCompare)
End Sub
Public Class myCompare
Implements IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
If TryCast(x, customObj).prTabIndex < TryCast(y, customObj).prTabIndex Then
Return -1
Else
Return 1
End If
End Function
End Class
...对列表进行排序(我觉得这很有用 - 让这个帖子略显学术化)。
Dim sortedL As List(Of KeyValuePair(Of String, customObj)) = dE.ToList
sortedL.Sort(Function(firstPair As KeyValuePair(Of String, customObj), nextPair As KeyValuePair(Of String, customObj)) firstPair.Value.prTabIndex.CompareTo(nextPair.Value.prTabIndex))
...或直接将lambda函数合并到SortedDictionary的转换中:
Dim dESorted = From kvp As KeyValuePair(Of String, customObj) In dE.ToDictionary(Function(first As KeyValuePair(Of String, customObj), second As KeyValuePair(Of String, customObj)) first.Value.prTabIndex.CompareTo(nextPair.Value.prTabIndex))
请注意,VS2008已经加下划线'dE.ToDictionary ...'(到行尾)并根据我将鼠标悬停在哪里给我两条消息:
1)“扩展方法'签名'中类型参数的数据类型由于'System.Linq.Enumerable中定义的'签名不能从这些参数中推断出来。明确指定数据类型可能会纠正这个问题错误。在“ToDictionary”上空盘旋时看到。
2)嵌套函数与委托“签名”的签名不同。看到“ToDictionary”之后盘旋在任何东西上。
不可否认,我是lambda函数的新手。
Q1)每个实施中我的距离是多远?
Q2)哪一个计算最便宜?为什么呢?
Q3)哪一个在计算上最贵?为什么呢?
温暖的问候,
-sf
答案 0 :(得分:3)
如果实现Generic IC Comparable(Of ...),则可以保存自我强制转换。我认为你也应该处理这两个对象相等的可能性。
Public Class DemoClass
Implements IComparable(Of DemoClass)
Private mstrField1 As String
Public Property Field1() As String
Get
Return mstrField1
End Get
Set(ByVal value As String)
mstrField1 = value
End Set
End Property
Private mstrField2 As String
Public Property Field2() As String
Get
Return mstrField2
End Get
Set(ByVal value As String)
mstrField2 = value
End Set
End Property
Private mstrField3 As String
Public Property Field3() As String
Get
Return mstrField3
End Get
Set(ByVal value As String)
mstrField3 = value
End Set
End Property
''' <summary>
''' Default sort - 1 ASC, 2 ASC, 3 ASC
''' </summary>
''' <param name="other"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function CompareTo(ByVal other As DemoClass) As Integer Implements System.IComparable(Of DemoClass).CompareTo
'-1 = less than other; 0 = same as other; +1 = greater than other'
Select Case Me.Field1
Case Is < other.Field1 : Return -1
Case Is > other.Field1 : Return 1
Case Else 'equal
Select Case Me.Field2
Case Is < other.Field2 : Return -1
Case Is > other.Field2 : Return 1
Case Else 'equal
Select Case Me.Field3
Case Is < other.Field3 : Return -1
Case Is > other.Field3 : Return 1
Case Else : Return 0 'equal
End Select
End Select
End Select
End Function
End Class