Provide different IComparer for a Class
using System;
using System.Collections.Generic;
public class Employee : IComparable<Employee>
{
private string name;
private int level;
private class AscendingLevelComparer : IComparer<Employee>
{
public int Compare(Employee x, Employee y)
{
if (x == null && y == null)
return 0;
else if (x == null)
return -1;
else if (y == null)
return 1;
if (x == y)
return 0;
return x.level - y.level;
}
}
public Employee(string name, int level)
{
this.name = name;
this.level = level;
}
public static IComparer<Employee> LevelSorter
{
get { return new AscendingLevelComparer(); }
}
public override string ToString()
{
return string.Format("{0}: Level = {1}", name, level);
}
public int CompareTo(Employee other)
{
if (other == null)
return 1;
if (other == this)
return 0;
return string.rupare(this.name, other.name, true);
}
}
public class MainClass
{
public static void Main()
{
List<Employee> employeeList = new List<Employee>();
employeeList.Add(new Employee("A", 1));
employeeList.Add(new Employee("B", 5));
employeeList.Add(new Employee("C", 2));
employeeList.Add(new Employee("D", 8));
employeeList.Add(new Employee("E", 5));
Console.WriteLine("Unsorted employee list:");
foreach (Employee n in employeeList)
{
Console.WriteLine(" " + n);
}
Console.WriteLine(Environment.NewLine);
Console.WriteLine("Employee list sorted by name (default order):");
employeeList.Sort();
foreach (Employee n in employeeList)
{
Console.WriteLine(" " + n);
}
Console.WriteLine(Environment.NewLine);
Console.WriteLine("Employee list sorted by level:");
employeeList.Sort(Employee.LevelSorter);
foreach (Employee n in employeeList)
{
Console.WriteLine(" " + n);
}
}
}
Unsorted employee list:
A: Level = 1
B: Level = 5
C: Level = 2
D: Level = 8
E: Level = 5
Employee list sorted by name (default order):
A: Level = 1
B: Level = 5
C: Level = 2
D: Level = 8
E: Level = 5
Employee list sorted by level:
A: Level = 1
C: Level = 2
E: Level = 5
B: Level = 5
D: Level = 8
Use generic IComparer<T>
using System;
using System.Collections.Generic;
// Create an IComparer<T> for Product objects.
class ProductComparer<T> : IComparer<T> where T : Product {
// Implement the IComparer<T> interface.
public int Compare(T obj1, T obj2) {
return obj1.name.rupareTo(obj2.name);
}
}
class Product {
public string name;
double cost;
int onhand;
public Product(string n, double c, int h) {
name = n;
cost = c;
onhand = h;
}
public override string ToString() {
return
String.Format("{0,-10}Cost: {1,6:C} On hand: {2}",
name, cost, onhand);
}
}
class MainClass {
public static void Main() {
ProductComparer<Product> comp = new ProductComparer<Product>();
List<Product> inv = new List<Product>();
// Add elements to the list
inv.Add(new Product("A", 5.5, 3));
inv.Add(new Product("B", 8.9, 2));
inv.Add(new Product("C", 3.0, 4));
inv.Add(new Product("D", 1.8, 8));
Console.WriteLine("Product list before sorting:");
foreach(Product i in inv) {
Console.WriteLine(" " + i);
}
Console.WriteLine();
// Sort the list using an IComparer.
inv.Sort(comp);
Console.WriteLine("Product list after sorting:");
foreach(Product i in inv) {
Console.WriteLine(" " + i);
}
}
}
Product list before sorting:
A Cost: $5.50 On hand: 3
B Cost: $8.90 On hand: 2
C Cost: $3.00 On hand: 4
D Cost: $1.80 On hand: 8
Product list after sorting:
A Cost: $5.50 On hand: 3
B Cost: $8.90 On hand: 2
C Cost: $3.00 On hand: 4
D Cost: $1.80 On hand: 8