Pre-requisite:- Please read regarding “IComparable” interface from .NET interview questions: - What is “IComparable”?.
If you read the above article properly,“IComparable” interface helps you to implement a default sort implementation for thecollection. But what if we want to sort using multiple criteria’s?.For those instances “IComparable” has a limitation and “IComparer” is the guy.
For example if we want to sort by “Name” under some situation and sort by “Age” under some other situations we need to implement “IComparer” interface.
So the first step is to create different classes for each sort criteria. These classes will implement “IComparer” interface and will have sorting logic defined in the “Compare” method. You can see we have two different classes defined “CompareByName” and “CompareByAge”. One compares on the basis of “name” and the other on the basis of “age”.
If you see the logic for “CompareByName” its simple. It uses the string comparison to evaluate the “Name” value sorting. But when we talk about numeric comparison there are 3 possible outputs Greater than , less than or Equal. So if you see “CompareByAge” class it returns 3 values 1 ( Greater than) , -1 ( Less than ) and 0 ( for Equal to).
Now that we have created the separate logics we can now invoke the “Peoples’ list by passing the class object. So for example if we want to sort by name, you will use the below code snippet.
If you read the above article properly,“IComparable” interface helps you to implement a default sort implementation for thecollection. But what if we want to sort using multiple criteria’s?.For those instances “IComparable” has a limitation and “IComparer” is the guy.
For example if we want to sort by “Name” under some situation and sort by “Age” under some other situations we need to implement “IComparer” interface.
So the first step is to create different classes for each sort criteria. These classes will implement “IComparer” interface and will have sorting logic defined in the “Compare” method. You can see we have two different classes defined “CompareByName” and “CompareByAge”. One compares on the basis of “name” and the other on the basis of “age”.
class CompareByName :
IComparer
{
public int Compare(Person x, Person y)
{
return string.Compare(x.Name,
y.Name);
}
}
class CompareByAge :
IComparer
{
public int Compare(Person x, Person y)
{
if (x.Age > y.Age) return 1;
if (x.Age < y.Age) return -1;
return 0;
}
}
If you see the logic for “CompareByName” its simple. It uses the string comparison to evaluate the “Name” value sorting. But when we talk about numeric comparison there are 3 possible outputs Greater than , less than or Equal. So if you see “CompareByAge” class it returns 3 values 1 ( Greater than) , -1 ( Less than ) and 0 ( for Equal to).
Now that we have created the separate logics we can now invoke the “Peoples’ list by passing the class object. So for example if we want to sort by name, you will use the below code snippet.
Peoples.Sort(new
CompareByName());
The output of the
above code is nothing but alphabetically sorted data.
Ajay 20
Loki 40
Madan 20
Raju 20
Shiv 20
Sukesh 30
If you invoke the
sort method of the list by using the age logic it will throw an output sorted
on age value.
Peoples.Sort(new
CompareByAge());
Ajay 20
Raju 20
Shiv 20
Madan 20
Sukesh 30
Loki 40
So the difference
is really default internal implementation or customizable external
implementation. When we use
“IComparable” we can have only one default sorting logic and that logic goes
inside the collection itself. For “IComparator” the logic is outside the
collection , in other words more extensible and the collection is not
disturbed.
For further c#
interview preparation you can go through the following articles
Huge collection of
c# interview question videos: - .NET interview question videos .
Read this article
on how to prepare for c# interviews: - c# interview questions and answers
Huge collection of c# and .NET interview question videos: - c# and .NET interview question videos.
Do forget SQL Server interview questions and answers on clustered and non-Clustered indexes.