Sorting Arrays of Custom Type
This example shows how to sort arrays in C#. Array can be sorted using static
method Array.Sort which internally use Quicksort
algorithm.
Sorting array of primitive types
To sort array of primitive types such as int,
double or string use method Array.Sort(Array) with the array as a parameter. The
primitive types implements interface IComparable, which is internally used by the Sort method (it
calls IComparable.CompareTo method).
See example how to sort int array:
// sort int array
int[] intArray = new int[5] { 8, 10, 2, 6, 3 };
Array.Sort(intArray);
// write array
foreach (int i in intArray) Console.Write(i + " "); // output: 2 3 6 8 10
Code:
// sort string array
string[] stringArray = new string[5] { "X", "B", "Z", "Y", "A" };
Array.Sort(stringArray);
// write array
foreach (string str in stringArray) Console.Write(str + " "); // output: A B X Y Z
Sorting array of custom type using delegate
To sort your own types, you can use
delegate to anonymous method. The generic delegate Comparison<T> is declared as
public delegate int
Comparison<T> (T x, T y). It points to a method that compares two
objects of the same type. It should return,
- less than 0 when X < Y
- zero when
X = Y
- greater than 0 when X > Y
The method (to which the delegate
points) can be also an anonymous method (written inline).
Following example demonstrates how to sort an array of custom
type using the delegate to anonymous comparison method. The custom type
in this case is a class User with two properties Name and Age.
Code:
// array of custom type
User[] users = new User[3] { new User("Betty", 23), // name, age
new User("Susan", 20),
new User("Lisa", 25) };
// sort array by name
Array.Sort(users, delegate(User user1, User user2) {
return user1.Name.CompareTo(user2.Name);
});
// write array (output: Betty23 Lisa25 Susan20)
foreach (User user in users) Console.Write(user.Name + user.Age + " ");
// sort array by age
Array.Sort(users, delegate(User user1, User user2) {
return user1.Age.CompareTo(user2.Age); // (user1.Age - user2.Age)
});
// write array (output: Susan20 Betty23 Lisa25)
foreach (User user in users) Console.Write(user.Name + user.Age + " ");
Sorting array using IComparable
If you implement IComparable interface in your custom type, you can sort array
easily like in the case of primitive types. The Sort method calls internally IComparable.CompareTo method.
Define the Custom Type which implements IComparable interface.
// custom type
public class User : IComparable
{
// Here you can declare properties Name, Age etc
// implement IComparable interface
public int CompareTo(object obj)
{
if (obj is User) {
return this.Name.CompareTo((obj as User).Name); // compare user names
}
throw new ArgumentException("Object is not a User");
}
}
How to use the above implementation? i.e., sort using IComparable implemented by User class
Code:
Array.Sort(users); // sort array of User objects
Comments
Post a Comment