Csharp/CSharp Tutorial/Generic/Generic IComparer

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

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