• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 234
  • Last Modified:

Sort Arraylist of Objects

How do you sort an arraylist of objects?  See attached code.
Please provide an example using Visual Basic.
Implements IComparable
 
      Public Shared AllObjects As New ArrayList
      Public Structure AnObject
         Dim FullName as string
         Dim SSN as string
      End Structure

Open in new window

0
Ray Turner
Asked:
Ray Turner
  • 3
  • 3
3 Solutions
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
One way...

(btw, why are you using an ArrayList if you have .Net 3.x?  Use a List(Of AnObject) instead...you can sort differently too then.)
Public Class Form1
 
    Public Structure AnObject
        Dim FullName As String
        Dim SSN As String
    End Structure
 
    Public Shared AllObjects As New ArrayList
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ao As New AnObject
        ao.FullName = "Mickey Mouse"
        ao.SSN = "123456789"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Donald Duck"
        ao.SSN = "987654321"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Zany Zebra"
        ao.SSN = "999999999"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Goofy"
        ao.SSN = "111111111"
        Form1.AllObjects.Add(ao)
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim mcc As New MyComparerClass
        Form1.AllObjects.Sort(mcc)
 
        For Each ao As AnObject In Form1.AllObjects
            Debug.Print(ao.FullName & " : " & ao.SSN)
        Next
    End Sub
 
    Private Class MyComparerClass
        Implements IComparer
 
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
            If TypeOf x Is AnObject AndAlso TypeOf y Is AnObject Then
                Dim ao1 As AnObject = DirectCast(x, AnObject)
                Dim ao2 As AnObject = DirectCast(y, AnObject)
                ' comparae by FullName for instance:
                Return ao1.FullName.CompareTo(ao2.FullName)
            Else
                Return 0
            End If
        End Function
    End Class
 
End Class

Open in new window

0
 
Ray TurnerSenior ConsultantAuthor Commented:
How do sort by fullname and ssn?
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
You have to first check if the names are equal...and if so, instead perform the comparison on SSN.  If you really have .Net 3.X then you can sort using LINQ instead...

But here it is old-school:
Private Class MyComparerClass
        Implements IComparer
 
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
            If TypeOf x Is AnObject AndAlso TypeOf y Is AnObject Then
                Dim ao1 As AnObject = DirectCast(x, AnObject)
                Dim ao2 As AnObject = DirectCast(y, AnObject)
                ' comparae by FullName for instance:
                Dim res As Integer = ao1.FullName.CompareTo(ao2.FullName)
                If res = 0 Then
                    res = ao1.SSN.CompareTo(ao2.SSN)               
                End If
                Return res
            Else
                Return 0
            End If
        End Function
    End Class

Open in new window

0
Free learning courses: Active Directory Deep Dive

Get a firm grasp on your IT environment when you learn Active Directory best practices with Veeam! Watch all, or choose any amount, of this three-part webinar series to improve your skills. From the basics to virtualization and backup, we got you covered.

 
Ray TurnerSenior ConsultantAuthor Commented:
One more question.  Is there a way to set the sort order?
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
Sure...set up a boolean flag in MyComparerClass to indicate ascending/descending sort order.  If we are sorting descending then we just swap "ao1" and "ao2" so the order is reversed:
Public Class Form1
 
    Public Structure AnObject
        Dim FullName As String
        Dim SSN As String
    End Structure
 
    Public Shared AllObjects As New ArrayList
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ao As New AnObject
        ao.FullName = "Mickey Mouse"
        ao.SSN = "123456789"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Donald Duck"
        ao.SSN = "987654321"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Zany Zebra"
        ao.SSN = "999999999"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Goofy"
        ao.SSN = "111111111"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Goofy"
        ao.SSN = "999999999"
        Form1.AllObjects.Add(ao)
 
        ao = New AnObject
        ao.FullName = "Goofy"
        ao.SSN = "555555555"
        Form1.AllObjects.Add(ao)
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim mcc As New MyComparerClass
        mcc.SortAscending = False
        Form1.AllObjects.Sort(mcc)
 
        For Each ao As AnObject In Form1.AllObjects
            Debug.Print(ao.FullName & " : " & ao.SSN)
        Next
    End Sub
 
    Private Class MyComparerClass
        Implements IComparer
 
        Public SortAscending As Boolean = True
 
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
            If TypeOf x Is AnObject AndAlso TypeOf y Is AnObject Then
                Dim ao1 As AnObject = DirectCast(x, AnObject)
                Dim ao2 As AnObject = DirectCast(y, AnObject)
 
                If Not SortAscending Then
                    ' swap the objects
                    Dim tmp As AnObject = ao1
                    ao1 = ao2
                    ao2 = tmp
                End If
 
                ' comparae by FullName for instance:
                Dim res As Integer = ao1.FullName.CompareTo(ao2.FullName)
                If res = 0 Then
                    res = ao1.SSN.CompareTo(ao2.SSN)
                End If
                Return res
            Else
                Return 0
            End If
        End Function
 
    End Class
 
End Class

Open in new window

0
 
Ray TurnerSenior ConsultantAuthor Commented:
Thanks!!!
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 3
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now