This tip demonstrates how to sort generic lists in a much simpler way without writing much complex loops and comparison logic.
The following steps are required for sorting the list:
1. Create class for sorting and implement interface IComparable wheres Type will reflect class for comparison
Ex: public class Racer : IComparable
2. Add properties in the above class
Ex:
public string FirstName { get; set; } public string LastName { get; set; } public string Country { get; set; } public int Wins { get; set; }
3. You have to override method of IComparable but it won’t be executed for sorting Ex:
public int CompareTo(Racer other)
4. Create a class for doing comparison which will implement IComparer for doing comparison Ex:
public class RacerComparer : IComparer
5. Add enum to save what will be items through sorting will be done. Ex:
public enum CompareType
6. Override compare function of IComparer Ex:
public int Compare(Racer x, Racer y)
You are done.
The complete code:
class Program { static void Main(string[] args) { //Create list of Racers List racers = new List(); racers.Add(new Racer() { FirstName = "Vikash", LastName = "Kumar", Country = "India", Wins = 40 }); racers.Add(new Racer() { FirstName = "Graham", LastName = "Hill", Country = "UK", Wins = 14 }); racers.Add(new Racer() { FirstName = "Emerson", LastName = "Fittipaldi", Country = "Brazil", Wins = 14 }); racers.Add(new Racer() { FirstName = "Mario", LastName = "Andretti", Country = "USA", Wins = 12 }); racers.Add(new Racer() { FirstName = "Michael", LastName = "Schumacher", Country = "Germany", Wins = 91 }); racers.Add(new Racer() { FirstName = "Mika", LastName = "Hakkinen", Country = "Finland", Wins = 20 }); racers.Add(new Racer() { FirstName = "Alain", LastName = "Prost", Country = "France", Wins = 51 }); racers.Add(new Racer() { FirstName = "Niki", LastName = "Lauda", Country = "Austria", Wins = 25 }); //Sort racer by passing RacerComparer instance with type of sorting that is required racers.Sort(new RacerComparer(RacerComparer.CompareType.Wins)); //Display result on Console racers.ForEach(Console.WriteLine); } } /// /// Class for storing Racer specific details and behaviour /// public class Racer : IComparable { //properties for class public string FirstName { get; set; } public string LastName { get; set; } public string Country { get; set; } public int Wins { get; set; } /// /// Overrided method of ToString() /// /// Racer's First name and Last Name public override string ToString() { return FirstName + " " + LastName; } /// /// Overrided method of IComparable() /// Compares with current instance on their name /// /// Racer object /// returns integer whether comparison is successuful or not public int CompareTo(Racer other) { int compare = this.LastName.CompareTo(other.LastName); if (compare == 0) return this.FirstName.CompareTo(other.FirstName); return compare; } } /// /// Racer compare class /// public class RacerComparer : IComparer { //Type of comparison needed public enum CompareType { FirstName, LastName, Country, Wins } private CompareType compareType; /// /// Cunstructor for intializing RacerComparer with CompareType /// /// Type of comparison public RacerComparer(CompareType compareType) { this.compareType = compareType; } /// /// Comaparison between two objects /// sorting will be done by this method /// /// First racer object /// Second racer object /// returns integer whether comparison is successuful or not public int Compare(Racer x, Racer y) { if (x == null) throw new ArgumentNullException("x"); if (y == null) throw new ArgumentNullException("y"); int result; //do comparison basis on CompareType and return result switch (compareType) { case CompareType.FirstName: return x.FirstName.CompareTo(y.FirstName); case CompareType.LastName: return x.LastName.CompareTo(y.LastName); case CompareType.Country: if ((result = x.Country.CompareTo(y.Country)) == 0) return x.LastName.CompareTo(y.LastName); else return result; case CompareType.Wins: return y.Wins.CompareTo(x.Wins); default: throw new ArgumentException("Invalid Compare Type"); } } }