根据列表中属于另一个列表的项目对列表进行排序
Sort a list based on an item inside the list that is another list
正如标题所说,但它变得更加复杂。这是一些示例代码
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
假设我想根据 object ExtraProps.value 对 class 人的列表进行排序,其中 Key = "name"
请注意,我在 vs2005 和 .NET 2.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)
首先感谢@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"))
正如标题所说,但它变得更加复杂。这是一些示例代码
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
假设我想根据 object ExtraProps.value 对 class 人的列表进行排序,其中 Key = "name"
请注意,我在 vs2005 和 .NET 2.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)
首先感谢@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"))