Click here to Skip to main content
Click here to Skip to main content

Sorting Lists using IComparable and IComparer Interface in .NET

By , 4 Oct 2009
 

Introduction

This article explains how to sort Lists by using two interfaces IComparable<> and IComparer<> provided by the .NET Framework.

Background

It's easy to sort a list of strings or integers by just calling the List.Sort() method, but how can we sort two objects and based on what field?

Let's look at a small example and see how we can solve the problem using IComparable<> and IComparer interfaces.

Example

Let's create a simple Employee class with two fields, Name and Salary.

class Employee 
{
     public string Name { get; set; }
     public int Salary { get; set; }
}

Now create a List of Employees and call Sort() method of a List.

// Use Collection Initializers( C# 3.0 ) to initialize the List             
List<Employee> empList = new List<Employee>() 
	{ new Employee { Name = "a", Salary = 14000 },
           new Employee { Name = "b", Salary = 13000 } 
         };
empList.Sort(); 

Oops! we got an exception!

The Exception says we need to implement IComparable<> interface,
List.Sort() sorts any class that implements IComparable<> Interface which has one method called CompareTo().

Let's implement IComparable<> interface to our Employee class:

class Employee : IComparable<Employee>
{
     public string Name { get; set; }
     public int Salary { get; set; }
        
     #region IComparable<Employee> Members
       
     public int CompareTo( Employee other )
     {
         if ( this.Salary < other.Salary ) return 1;
         else if ( this.Salary > other.Salary ) return -1;
         else return 0;
     }
        
     #endregion
}

In the above code, we are sorting objects based on salary of employee in descending order, by implementing CompareTo() method of IComparable interface which takes Employee reference as a parameter.
Now, calling empList.Sort() gives no exception and empList is well sorted by salary.

But sometimes, we may need to sort a list of objects when class does not implement IComparable<> interface and also we may need various kinds of sorting on that class like:

  1. Sort Employees by Salary in Ascending Order
  2. Sort Employees by Salary in Descending Order
  3. Sort Employees by Name

To solve this problem, .NET provides a special interface called IComparer<> which has a method Compare(), takes two object parameters X, Y and returns an int.
Use of IComparer<> interface tells List how exactly you want to sort.

class Employee_SortBySalaryByAscendingOrder : IComparer<Employee>
{
    #region IComparer<Employee> Members
    
    public int Compare( Employee x, Employee y )
    {
        if ( x.Salary > y.Salary ) return 1;
        else if ( x.Salary < y.Salary ) return -1;
        else return 0;
    }
    
    #endregion
}

class Employee_SortBySalaryByDescendingOrder : IComparer<Employee>
{
    #region IComparer<Employee> Members
    
    public int Compare( Employee x, Employee y )
    {
        if ( x.Salary < y.Salary ) return 1;
        else if ( x.Salary > y.Salary ) return -1;
        else return 0;
    }
    
    #endregion
}

class Employee_SortByName : IComparer<Employee>
{
    #region IComparer<Employee> Members
    
    public int Compare( Employee x, Employee y )
    {
        return string.Compare( x.Name, y.Name );
    }
    
    #endregion
}

The above code introduces three classes by implementing Compare() method of IComparer interface.

Now, how do we use this? We just have to pass the reference of these classes as a object parameter to Sort() method as shown below:

// Use Collection Initializers( C# 3.0 ) to initialize the List 
List<Employee> empList = new List<Employee>() 
		{ new Employee { Name = "a", Salary = 14000 },
                    new Employee { Name = "b", Salary = 13000 } 
                  };
                                     
Employee_SortBySalaryByAscendingOrder eAsc = 
		new Employee_SortBySalaryByAscendingOrder(); 
// Sort Employees by salary by ascending order.   
empList.Sort( eAsc );
    
Employee_SortBySalaryByDescendingOrder eDsc = 
		new Employee_SortBySalaryByDescendingOrder();
// Sort Employees by salary by descending order. 
empList.Sort( eDsc );
    
Employee_SortByName eName = new Employee_SortByName();
// Sort Employees by their names.                                 
empList.Sort( eName );

Conclusion

Sorting Lists is simple as long as you sort basic elements like strings and integers for which comparison classes are defined.

Usage of IComparable<> and IComparer<> interface helps to sort Lists of objects on custom classes easily.

History

  • v1.0 - Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Abhishek D V
Software Developer (Senior) Education First Information Systems pvt ltd.
India India
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 4membertrying826 May '13 - 11:51 
GeneralMy vote of 5mvpShivprasad koirala11 Mar '13 - 8:52 
GeneralNice articlememberwknopf21 Feb '13 - 7:05 
GeneralMy vote of 5memberdedlok10 Aug '12 - 11:06 
GeneralSimle and Effective ExplanationmemberImtiaz.Ahmed30 Apr '11 - 3:00 
GeneralGood articlememberhammerstein059 Feb '10 - 3:58 
GeneralNicemvpLuc Pattyn5 Oct '09 - 7:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 4 Oct 2009
Article Copyright 2009 by Abhishek D V
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid