代码之家  ›  专栏  ›  技术社区  ›  Bjorn Fontaine

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

  •  0
  • Bjorn Fontaine  · 技术社区  · 6 年前

    正如提特尔所说,但它变得更加复杂。这是一些示例代码

    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
    

    请注意,我使用的是vs2005和.NET的2.0版

    2 回复  |  直到 6 年前
        1
  •  0
  •   jmcilhinney    6 年前

    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)
    
        2
  •  0
  •   Bjorn Fontaine    6 年前

    首先我要感谢@TimSchmelter的回答。这在.NET2.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"))