根据列表中属于另一个列表的项目对列表进行排序

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"))