CSharp - Comparison between IComparer and IComparable

/*

Author: Jiangong SUN

*/


I've already written an article introducing the usage of comparer here. In this article I'll compare the usage of IComparable and IComparer with examples.


Important difference:  A class can have only one Comparable, but multiple Comparer.


Here I have a class Student with different properties, which will be used as sorting criterias.

 

        public class Student : IComparable<Student>
        {
            public string LastName { get; set; }
            public string FirstName { get; set; }
            public int Age { get; set; }
            public int Class { get; set; }
        }

 

 

Firstly, I want class Student to implement interface IComparable, and I must override method CompareTo of interface IComparable. In this method I sort Student list in an ascending order.

 

        //class who implement interface IComparable, must implement CompareTo method
        public class Student : IComparable<Student>
        {
            public string LastName { get; set; }
            public string FirstName { get; set; }
            public int Age { get; set; }
            public int Class { get; set; }
            //CompareTo method compare itself to another object
            public int CompareTo(Student student)
            {
                return LastName.CompareTo(student.LastName);
            }
        }

In this way, Student list will be sorted by LastName in an ascending order.

 


Next, I'll create 3 comparers who will use the rest 3 properties as sorting criteria.

 

        //Comparer 1
        //class who implement interfce IComparer, must implement Compare method
        public class OrderByAgeAscending : IComparer<Student>
        {
            //Compare method compares two objects
            public int Compare(Student x, Student y)
            {
                if (x.Age.CompareTo(y.Age) < 0)
                {
                    return -1;
                }
                if (x.Age.CompareTo(y.Age) == 0)
                {
                    return 0;
                }
                return 1;
            }
        }

        //Comparer 2
        public class OrderByClassDescending : IComparer<Student>
        {
            public int Compare(Student x, Student y)
            {
                if (x.Class.CompareTo(y.Class) < 0)
                {
                    return 1;
                }
                if (x.Class.CompareTo(y.Class) == 0)
                {
                    return 0;
                }
                return -1;
            }
        }

        //Comparer 3
        public class OrderByFirstNameAscending : IComparer<Student>
        {
            public int Compare(Student x, Student y)
            {
                if (x.FirstName.CompareTo(y.FirstName) < 0)
                {
                    return -1;
                } if (x.FirstName.CompareTo(y.FirstName) == 0)
                {
                    return 0;
                }
                return 1;
            }
        }


Now I will create a new Student list with some Students and try to sort them with comparable and comparer.

 

Firstly, I will create a list.

 

            var s1 = new Student() { LastName = "charles", FirstName = "charles", Age = 27, Class = 15 };
            var s2 = new Student() { LastName = "viz", FirstName = "newton", Age = 20, Class = 30 };
            var s3 = new Student() { LastName = "la", FirstName = "aba", Age = 2, Class = 2 };
            var students = new List<Student>() { s1, s2, s3 };


Then, I will sort the list with comparable. I just need to call Sort() method, it will use the CompareTo() method I've created.

 

 

            //IComparable: sort by last name
            students.Sort();
            Display(students, "IComparable OrderByLastName:");

 


And then, I will use the 3 comparers to sort the list.

 

            //Comparer 1: order by age
            var c1 = new OrderByAgeAscending();
            students.Sort(c1);
            Display(students, "Comparer OrderByAgeAscending:");

            //Comparer 2: order by class
            var c2 = new OrderByClassDescending();
            students.Sort(c2);
            Display(students, "Comparer OrderByClassDescending:");

            //Comparer 3: order by first name 
            var c3 = new OrderByFirstNameAscending();
            students.Sort(c3);
            Display(students, "Comparer OrderByFirstNameAscending");


And there are an Display() method who is in charge of display the student information.

 

 

        public static void Display(List<Student> students, string comparerName)
        {
            Console.WriteLine(comparerName);
            foreach (var student in students)
            {
                Console.WriteLine("last name: " + student.LastName + "; first name: " + student.FirstName + "; age: " + student.Age + "; class: " + student.Class);
            }
        }


Now, let's see the results:

 



Right now, we are arrived at the end of the article. I hope you can find useful information here. Enjoy coding!




references:

http://addinit.com/node/50

http://www.codeproject.com/Articles/42839/Sorting-Lists-using-IComparable-and-IComparer-Inte

 

posted @ 2013-07-09 16:14  爱生活,爱编程  阅读(225)  评论(0编辑  收藏  举报