正如titel所说,但情况变得更加复杂。这是一些示例代码
class person
prop name as string
prop age as int
prop properties as List(of ExtraProps)
class ExtraProps
prop key as string
prop value as string
所以说我想基于一个对象ExtraProps.value对一个类人列表进行排序,其中Key =“ name”
请注意,我正在使用vs2005和.NET 2.0版
答案 0 :(得分:0)
例如
Private Function ComparePersonsByExtraPropsName(p1 As Person, p2 As Person) As Integer
Return GetFirstExtraProp(p1.Properties, "Name").Value.CompareTo(GetFirstExtraProp(p2.Properties, "Name").Value)
End Function
Private Function GetFirstExtraProp(properties As IEnumerable(Of ExtraProps), key As String) As ExtraProps
For Each ep As ExtraProps In properties
If ep.Key = key Then
Return ep
End If
Next
Return Nothing
End Function
然后:
Dim personList As New List(Of Person)
'...
personList.Sort(AddressOf ComparePersonsByExtraPropsName)
答案 1 :(得分:0)
首先,我要感谢@TimSchmelter的回答。在.NET 2.0和VS2005中都可以完美运行。
Public Class TaskKeyComparer
Implements IComparer(Of Trimble_Planning.TaskData)
Private ReadOnly _keyComparison As StringComparison
Private ReadOnly _valueComparison As StringComparison
Private ReadOnly _key As String
Public Sub New(ByVal key As String, Optional ByVal keyComparison As StringComparison = StringComparison.CurrentCulture, Optional ByVal valueComparison As StringComparison = StringComparison.CurrentCulture)
_key = key
_keyComparison = keyComparison
_valueComparison = valueComparison
End Sub
Public Function Compare(ByVal x As person, ByVal y As person) As Integer Implements IComparer(Of person).Compare
If x Is Nothing AndAlso y Is Nothing Then Return 0
If x Is Nothing OrElse y Is Nothing Then Return CInt(IIf(x Is Nothing, -1, 1))
If x.properties Is Nothing AndAlso y.properties Is Nothing Then Return 0
If x.properties Is Nothing OrElse y.properties Is Nothing Then Return CInt(IIf(x.properties Is Nothing, -1, 1))
Dim xKeyValue As String = Nothing
Dim yKeyValue As String = Nothing
For Each prop As ExtraProps In x.properties
If String.Equals(prop.key, _key, _keyComparison) Then
xKeyValue = prop.value
Exit For
End If
Next
For Each prop As ExtraProps In y.properties
If String.Equals(prop.key, _key, _keyComparison) Then
yKeyValue = prop.value
Exit For
End If
Next
Return String.Compare(xKeyValue, yKeyValue, _valueComparison)
End Function
End Class
然后像这样使用它
personList.Sort(New TaskKeyComparer("name"))