Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I sort a List<T> by multiple T.attributes?

Tags:

c#

list

sorting

Let's say I have a List of Songs.

Song {     public string Name = "";     public int PlayOrder = 0;     } 

Now I want to sort them first by PlayOrder starting at zero and second by Name alphabetically.

So an example set of sorted results would be (Name, PlayOrder):

/*     Pachelbel's Canon, 0     A Happy Song, 4     Beethoven's 5th, 4     Some Other Song, 7 */ 

See how the PlayOrder = 4 ones are in order alphabetically? That's what I'm going for.

Right now I have it only sorting by one field:

List<Song> final = new List<Song>();  ...  final.Sort((x, y) => x.PlayOrder.CompareTo(y.PlayOrder));  return final; 

How can I also sort by Name as demonstrated above?

like image 945
MetaGuru Avatar asked Feb 02 '11 14:02

MetaGuru


People also ask

Can you sort a list C#?

Sorting in C# In C#, we can do sorting using the built-in Sort / OrderBy methods with the Comparison delegate, the IComparer , and IComparable interfaces.


2 Answers

return final.OrderBy(s => s.PlayOrder).ThenBy(s => s.Name); 
like image 160
Kris Ivanov Avatar answered Oct 09 '22 20:10

Kris Ivanov


If you want to continue using the sort method you will need to make your comparison function smarter:

final.Sort((x, y) => {     var ret = x.PlayOrder.CompareTo(y.PlayOrder);     if (ret == 0) ret = x.Name.CompareTo(y.Name);     return ret; }); 

If you want to use LINQ then you can go with what K Ivanov posted.

like image 24
tster Avatar answered Oct 09 '22 20:10

tster