Sort List(of Object) by object properties

前端 未结 3 1244
南方客
南方客 2021-01-26 02:13

I\'m trying to achieve something where the answer is already given for. But it\'s in c# and I don\'t have any knowledge what-so-ever over c# so I\'m lo

相关标签:
3条回答
  • 2021-01-26 02:25

    This C# code from that other thread:

    List<Order> SortedList = objListOrder.OrderBy(o=>o.OrderDate).ToList();
    

    equates to this VB code:

    List(Of Order) SortedList = objListOrder.OrderBy(Function(o) o.OrderDate).ToList()
    

    As you can see, very little changes. You just have to know the syntax for generics and lambda expressions.

    You should be aware, though, that this code does NOT sort your list. It sorts the items in the list and then adds them to a new list in that order. This is perfectly fine for many applications but if you're using that same list elsewhere then you won't see the new order there. While there are a few variations, one way to actually sort the list in place is like this:

    objListOrder.Sort(Function(o1, o2) o1.OrderDate.CompareTo(o2.OrderDate))
    
    0 讨论(0)
  • 2021-01-26 02:27

    Use LINQ OrderBy:

    _NewBomList.OrderBy(Function(bi) bi.ItemNumber)
    

    and for descending:

    _NewBomList.OrderByDescending(Function(bi) bi.ItemNumber)
    

    If you want a numeric order in your string you have to convert it to an integer first:

    _NewBomList.OrderBy(Function(bi) Integer.Parse(bi.ItemNumber))
    

    Edit:
    To provide a custom IComparer for the OrderBy extension you have to create a class which implements IComparer(Of String) where String are your ItemNumbers to compare:

     Class ItemNumberComparer  
         Implements IComparer(Of String)
    
         Public Function Compare(String x, String y)
             Dim ix As String() = x.Split("."C)
             Dim iy As String() = y.Split("."C)
    
             Dim maxLen As Integer = Math.Max(ix.Length, iy.Length)
             For i As Integer = 0 To maxLen - 2
                 If ix.Length >= i AndAlso iy.Length >= i Then
                    If Integer.Parse(ix(i)) < Integer.Parse(iy(i)) Then
                       Return -1 'If x.i is LT y.i it must be smaller at all
                    ElseIf Integer.Parse(ix(i)) > Integer.Parse(iy(i)) Then
                       Return 1 'If x.i is GT y.i it must be bigger all
                    End If
                 End If
             Next
             'This code is only executed if x and y differ at last number or have different ´number of dots
            If ix.Length = iy.Length Then
                Return Integer.Parse(ix(ix.Length - 1)).CompareTo(Integer.Parse(iy(iy.Length - 1))) 'Only last number differs
           Else
               Return ix.Length.CompareTo(iy.Length) 'The number with more dots is smaller
           End If
    
         End Function     
      End Class
    

    Call syntax:

    Dim comparer = new ItemNumberComparer()
    _NewBomList.OrderByDescending(Function(bi) bi.ItemNumber, comparer)
    
    0 讨论(0)
  • 2021-01-26 02:40

    Another solution would be to implement the IComparable (see MSDN ref) interface. This interface is designed to sort your objects on a custom way :

    Public Class BomItem
        Implements IComparable
    
        Public Property ItemNumber As String
        Public Property Description As String
        Public Property Quantity As Double
        Public Property Material As String
        Public Property Certificate As String
    
        Public Function CompareTo(obj As Object) As Integer
             Dim bom = CType(obj, BomItem)
    
             If Not bom Is Nothing then
                 Return Me.ItemNumber.CompareTo(bom.ItemNumber)
             Else
                 Throw New ArgumentException("Object is not a BomItem")
             End If
    End Class
    

    and you can sort the list this way :

    Dim myList As New List(Of BomItem)
    
    'Code to add your BomItems
    
    myList.Sort()
    

    This will actually sort your list, it does not create a new list.

    0 讨论(0)
提交回复
热议问题