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# !

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.