How can I perform a sort on two different criteria?
For example, I have person objects like:
Person with properties FirstName (string), LastName, and Rank (int).
Example data like so:
Xavier Smith 1
Alexander Smith 2
Alexander Smith 1
Bob Hawke 2
It should sort on FirstName alphabetically, then on rank, e.g. resulting:
Alexander Smith 1
Alexander Smith 2
Bob Hawke 2
Xavier Smith 1
So far, I have tried the following, but it isn’t working properly:
peopleList is List<Person>
peopleList.Sort(new Comparison<Person>((x,y) => x.Rank.CompareTo(y.Rank)));
peopleList.Sort(new Comparison<Person>((x, y) => string.Compare(x.Name, y.Name)));
Thanks
edit: to avoid changing my code too much, I really want to keep list, if I change the above lines to:
peopleList.OrderBy(person => person.FirstName).ThenBy(person => person.Rank).ToList();
Would give the exact same list just sorted properly, correct?
LINQ Approach
With LINQ you can use OrderBy and ThenBy:
This will return an
IEnumerable<T>. If you really need aList<T>add a.ToList()at the end.If you want to use the
Sortmethod then you’ll need to write a custom comparer.EDIT: using
ToList()returns a new list. If you want to sort your existing list then you should use theSortmethod which does not return a list but rather operates on the current list (it is avoidmethod).Sort / Comparer Approach
Use:
list.Sort(new PersonComparer());Here’s the comparer code. It was adapted from the MSDN example so I recommend reading the comments they used to understand why it is structured this way.