Сортировка списка на основе элемента в списке, который является другим списком - PullRequest
0 голосов
/ 12 сентября 2018

Как говорит титул, но это становится еще сложнее.это пример кода

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 и в версии 2.0 .NET

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Сначала я хотел бы поблагодарить @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"))
0 голосов
/ 12 сентября 2018

Например

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