Csharp/C Sharp/Collections Data Structure/Compare

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

Implement IComparable

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Implement IComparable. 
 
using System; 
using System.Collections; 
 
class Inventory : IComparable { 
  string name; 
  double cost; 
  int onhand; 
 
  public Inventory(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); 
  } 
 
  // Implement the IComparable interface. 
  public int CompareTo(object obj) { 
    Inventory b; 
    b = (Inventory) obj; 
    return name.rupareTo(b.name); 
  } 
} 
 
public class IComparableDemo { 
  public static void Main() { 
    ArrayList inv = new ArrayList(); 
     
    // Add elements to the list 
    inv.Add(new Inventory("Pliers", 5.95, 3)); 
    inv.Add(new Inventory("Wrenches", 8.29, 2));    
    inv.Add(new Inventory("Hammers", 3.50, 4)); 
    inv.Add(new Inventory("Drills", 19.88, 8)); 
 
    Console.WriteLine("Inventory list before sorting:"); 
    foreach(Inventory i in inv) { 
      Console.WriteLine("   " + i); 
    } 
    Console.WriteLine(); 
 
    // Sort the list. 
    inv.Sort(); 
 
    Console.WriteLine("Inventory list after sorting:"); 
    foreach(Inventory i in inv) { 
      Console.WriteLine("   " + i); 
    } 
  } 
}


implements the IComparable interface

using System;
public class NewOrderedName : IComparable {
  private String firstName;
  private String lastName;
  public NewOrderedName(String f, String l) {
     firstName = f;
     lastName = l;
  }
  public int CompareTo(Object o) {
    NewOrderedName name = (NewOrderedName)o;
    int lastResult = lastName.rupareTo(name.lastName);
    if (lastResult != 0)
      return lastResult;
    else {
      int firstResult = firstName.rupareTo(name.firstName);
      if (firstResult != 0)
         return firstResult;
      else
         return 1;
    }
  }
  public static void Main() {
    NewOrderedName jAdams = new NewOrderedName("J", "A");
    NewOrderedName jqAdams = new NewOrderedName("A", "Q");
    NewOrderedName hAdams = new NewOrderedName("H", "S");
    Console.WriteLine ("jAdams vs. jqAdams {0}", jAdams.rupareTo(jqAdams)); 
    Console.WriteLine ("jAdams vs. hAdams {0}", jAdams.rupareTo(hAdams)); 
    Console.WriteLine ("hAdams vs. hAdams {0}", hAdams.rupareTo(hAdams)); 
  }
}


Sorting and Searching:Advanced Use of Hashes

using System;
using System.Collections;
public class AdvancedUseofHashes
{
    public static void Main()
    {
        Employee herb = new Employee("H", 5);
        Employee george = new Employee("G", 1);
        Employee frank = new Employee("F", 2);
        Hashtable employees = 
        new Hashtable(Employee.HashByName, Employee.SortByName);
        employees.Add(herb, "AA");
        employees.Add(george, "BB");
        employees.Add(frank, "CC");
        Employee herbClone = new Employee("H", 000);
        string address =(string) employees[herbClone];
        Console.WriteLine("{0} lives at {1}", herbClone, address);
    }
}
public class Employee: IComparable
{
    public Employee(string name, int id)
    {
        this.name = name;
        this.id = id;
    }
    
    int IComparable.rupareTo(object obj)
    {
        Employee emp2 = (Employee) obj;
        if (this.id > emp2.id)
        return(1);
        if (this.id < emp2.id)
        return(-1);
        else
        return(0);
    }
    public override int GetHashCode()
    {
        return(id);
    }
    public static IComparer SortByName
    {
        get
        {
            return((IComparer) new SortByNameClass());
        }
    }
    
    public static IComparer SortById
    {
        get
        {
            return((IComparer) new SortByIdClass());
        }
    }
    public static IHashCodeProvider HashByName
    {
        get
        {
            return((IHashCodeProvider) new HashByNameClass());
        }
    }
    public override string ToString()
    {
        return(name + ":" + id);
    }
    
    class SortByNameClass: IComparer
    {
        public int Compare(object obj1, object obj2)
        {
            Employee emp1 = (Employee) obj1;
            Employee emp2 = (Employee) obj2;
            
            return(String.rupare(emp1.name, emp2.name));
        }
    }
    
    class SortByIdClass: IComparer
    {
        public int Compare(object obj1, object obj2)
        {
            Employee emp1 = (Employee) obj1;
            Employee emp2 = (Employee) obj2;
            
            return(((IComparable) emp1).rupareTo(obj2));
        }
    }
    class HashByNameClass: IHashCodeProvider
    {
        public int GetHashCode(object obj)
        {
            Employee emp = (Employee) obj;
            return(emp.name.GetHashCode());
        }
    }
    
    string    name;
    int    id;
}


Sorting and Searching:IComparer as a Property

using System;
using System.Collections;
public class IComparerasaProperty
{
    public static void Main()
    {
        Employee[] arr = new Employee[4];
        arr[0] = new Employee("A", 1);
        arr[1] = new Employee("B", 2);
        arr[2] = new Employee("C", 4);
        arr[3] = new Employee("D", 3);
        
        Array.Sort(arr, Employee.SortByName);
        // employees is now sorted by name
        
        foreach (Employee emp in arr)
        Console.WriteLine("Employee: {0}", emp);
        
        Array.Sort(arr, Employee.SortById);
        // employees is now sorted by id
        
        foreach (Employee emp in arr)
        Console.WriteLine("Employee: {0}", emp);
        
        ArrayList arrList = new ArrayList();
        arrList.Add(arr[0]);
        arrList.Add(arr[1]);
        arrList.Add(arr[2]);
        arrList.Add(arr[3]);
        arrList.Sort(Employee.SortByName);
        
        foreach (Employee emp in arrList)
        Console.WriteLine("Employee: {0}", emp);
        
        arrList.Sort();    // default is by id
        
        foreach (Employee emp in arrList)
        Console.WriteLine("Employee: {0}", emp);
    }
}
public class Employee: IComparable
{
    public Employee(string name, int id)
    {
        this.name = name;
        this.id = id;
    }
    
    int IComparable.rupareTo(object obj)
    {
        Employee emp2 = (Employee) obj;
        if (this.id > emp2.id)
        return(1);
        if (this.id < emp2.id)
        return(-1);
        else
        return(0);
    }
    
    public static IComparer SortByName
    {
        get
        {
            return((IComparer) new SortByNameClass());
        }
    }
    
    public static IComparer SortById
    {
        get
        {
            return((IComparer) new SortByIdClass());
        }
    }
    
    public override string ToString()
    {
        return(name + ":" + id);
    }
    
    class SortByNameClass: IComparer
    {
        public int Compare(object obj1, object obj2)
        {
            Employee emp1 = (Employee) obj1;
            Employee emp2 = (Employee) obj2;
            
            return(String.rupare(emp1.name, emp2.name));
        }
    }
    
    class SortByIdClass: IComparer
    {
        public int Compare(object obj1, object obj2)
        {
            Employee emp1 = (Employee) obj1;
            Employee emp2 = (Employee) obj2;
            
            return(((IComparable) emp1).rupareTo(obj2));
        }
    }
    
    string    name;
    int    id;
}


Sorting and Searching:Implementing IComparable

using System;
public class ImplementingIComparable {
    public static void Main()
    {
        Employee[] arr = new Employee[4];
        arr[0] = new Employee("A", 1);
        arr[1] = new Employee("B", 2);
        arr[2] = new Employee("C", 4);
        arr[3] = new Employee("D", 3);
        
        Array.Sort(arr);
        foreach (Employee emp in arr)
        Console.WriteLine("Employee: {0}", emp);
        
        // Find employee id 2 in the list;
        Employee employeeToFind = new Employee(null, 2);
        int index = Array.BinarySearch(arr, employeeToFind);
        if (index != -1)
        Console.WriteLine("Found: {0}", arr[index]);    
    }
}
public class Employee: IComparable
{
    public Employee(string name, int id)
    {
        this.name = name;
        this.id = id;
    }
    
    int IComparable.rupareTo(object obj)
    {
        Employee emp2 = (Employee) obj;
        if (this.id > emp2.id)
        return(1);
        if (this.id < emp2.id)
        return(-1);
        else
        return(0);
    }
    
    public override string ToString()
    {
        return(String.Format("{0}:{1}", name, id));
    }
    
    string    name;
    int    id;
}


Sorting and Searching:Using IComparer

using System;
using System.Collections;
public class SortingandSearchingUsingIComparer1
{
    public static void Main()
    {
        Employee[] arr = new Employee[4];
        arr[0] = new Employee("A", 1);
        arr[1] = new Employee("B", 2);
        arr[2] = new Employee("C", 4);
        arr[3] = new Employee("D", 3);
        
        Array.Sort(arr, (IComparer) new Employee.SortByNameClass());
        // employees is now sorted by name
        
        foreach (Employee emp in arr)
        Console.WriteLine("Employee: {0}", emp);
        
        Array.Sort(arr, (IComparer) new Employee.SortByIdClass());
        // employees is now sorted by id
        
        foreach (Employee emp in arr)
        Console.WriteLine("Employee: {0}", emp);
        
        ArrayList arrList = new ArrayList();
        arrList.Add(arr[0]);
        arrList.Add(arr[1]);
        arrList.Add(arr[2]);
        arrList.Add(arr[3]);
        arrList.Sort((IComparer) new Employee.SortByNameClass());
        
        foreach (Employee emp in arrList)
        Console.WriteLine("Employee: {0}", emp);
        
        arrList.Sort();    // default is by id
        
        foreach (Employee emp in arrList)
        Console.WriteLine("Employee: {0}", emp);
    }
}
public class Employee: IComparable
{
    public Employee(string name, int id)
    {
        this.name = name;
        this.id = id;
    }
    
    int IComparable.rupareTo(object obj)
    {
        Employee emp2 = (Employee) obj;
        if (this.id > emp2.id)
        return(1);
        if (this.id < emp2.id)
        return(-1);
        else
        return(0);
    }
    
    public override string ToString()
    {
        return(name + ":" + id);
    }
    
    public class SortByNameClass: IComparer
    {
        public int Compare(object obj1, object obj2)
        {
            Employee emp1 = (Employee) obj1;
            Employee emp2 = (Employee) obj2;
            
            return(String.rupare(emp1.name, emp2.name));
        }
    }
    
    public class SortByIdClass: IComparer
    {
        public int Compare(object obj1, object obj2)
        {
            Employee emp1 = (Employee) obj1;
            Employee emp2 = (Employee) obj2;
            
            return(((IComparable) emp1).rupareTo(obj2));
        }
    }
    
    string    name;
    int    id;
}


Use IComparer

/*
C#: The Complete Reference 
by Herbert Schildt 
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Use IComparer. 
 
using System; 
using System.Collections; 
 
// Create an IComparer for Inventory objects. 
class CompInv : IComparer { 
  // Implement the IComparable interface. 
  public int Compare(object obj1, object obj2) { 
    Inventory a, b; 
    a = (Inventory) obj1; 
    b = (Inventory) obj2; 
    return a.name.rupareTo(b.name); 
  } 
} 
 
class Inventory { 
  public string name; 
  double cost; 
  int onhand; 
 
  public Inventory(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); 
  } 
} 
 
public class MailList { 
  public static void Main() { 
    CompInv comp = new CompInv(); 
    ArrayList inv = new ArrayList(); 
     
    // Add elements to the list 
    inv.Add(new Inventory("Pliers", 5.95, 3)); 
    inv.Add(new Inventory("Wrenches", 8.29, 2));    
    inv.Add(new Inventory("Hammers", 3.50, 4)); 
    inv.Add(new Inventory("Drills", 19.88, 8)); 
 
    Console.WriteLine("Inventory list before sorting:"); 
    foreach(Inventory i in inv) { 
      Console.WriteLine("   " + i); 
    } 
    Console.WriteLine(); 
 
    // Sort the list using an IComparer. 
    inv.Sort(comp); 
 
    Console.WriteLine("Inventory list after sorting:"); 
    foreach(Inventory i in inv) { 
      Console.WriteLine("   " + i); 
    } 
  } 
}