30

I using a genric list(m_equipmentList ) which is collection of objects (Schedule_Payitem).
How can sort list according to a proerty of child object ?

Dim m_equipmentList As New List(Of Schedule_Payitem)

Need to sort m_equipmentList on basis of resourceid property of Schedule_Payitem.

1
  • Thanks for asking this. I was able to use the lambda expression from Jon Skeet in one of my projects. Commented May 28, 2009 at 20:29

4 Answers 4

59

Are you using VB9? If so, I'd use a lambda expression to create a Comparer(Of Schedule_PayItem). Otherwise, write a short class to implement IComparer(Of Schedule_PayItem). pass whichever one you've got into List.Sort.

An example for the lambda expression (untested):

m_equipmentList.Sort(Function(p1, p2) p1.ResourceID.CompareTo(p2.ResourceID))

And for the IComparer(Of Schedule_PayItem):

Public Class PayItemResourceComparer
    Implements IComparer(Of Schedule_PayItem)
    Public Function Compare(ByVal p1 As Schedule_PayItem, _
                            ByVal p2 As Schedule_PayItem) As Integer
        Return p1.ResourceID.CompareTo(p2.ResourceID)
    End Function
End Class

...

m_equipmentList.Sort(New PayItemResourceComparer)
Sign up to request clarification or add additional context in comments.

1 Comment

Helpful tip to specify Collections.Generic.IComparer(Of Schedule_PayItem). I was getting an error: 'System.Collections.IComparer' has no type parameters. A little searching helped me find that two such interfaces with same name exist, one in System.Collections and another in System.Collections.Generic.
7

I don't know vb.net so I did it in C#

m_equipmentList.Sort(
   (payItem1,payItem2)=>payItem1.ResourceID.CompareTo(payItem2.ResourceID));

and using the reflector translated it to vb.net hope it helps

m_equipmentList.Sort(
Function (ByVal payItem1 As Schedule_Payitem, ByVal payItem2 As Schedule_Payitem) 
    Return payItem1.ResourceID.CompareTo(payItem2.ResourceID)
End Function)

or you can inherit Schedule_Payitem from IComparable and implement CompareTo and then just call m_equipmentList.Sort()

1 Comment

This is a great way for lots of problems :D
5

You can accomplish sorting the list in descending order by changing this-

m_equipmentList.Sort(
Function (ByVal payItem1 As Schedule_Payitem, ByVal payItem2 As Schedule_Payitem) 
    Return payItem1.ResourceID.CompareTo(payItem2.ResourceID)
End Function)

to this

m_equipmentList.Sort(
Function (ByVal payItem1 As Schedule_Payitem, ByVal payItem2 As Schedule_Payitem) 
    Return payItem2.ResourceID.CompareTo(payItem1.ResourceID)
End Function)

Comments

0

Try this

Dim m_equipmentList As New List(Of Schedule_Payitem)


m_equipmentList.Sort(delegate(Schedule_Payitem p1, Schedule_Payitem p2)
              {
                  return p1.resourceid .CompareTo(p2.resourceid );
              });

2 Comments

VB.Net doesn't have anonymous delegate support until vs2008, so the conversion from this code may not be trivial.
You code is a mix of C# and VB.Net ! ';' character at end of line is for C# !

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.