IComparer<T> VS IComparable<T>

IComparer<T> VS IComparable<T>两者的比较其实是如何实现对象的custom sort 和default sort的过程。微软的MSDN上有一个sample很好的说明了这二者的区别与联系。

//Main 函数:

 
// Nested class to do descending sort on year property.

private class sortYearDescendingHelper :IComparer<Car>

{

      int IComparer<Car>.Compare(Car a, Car b)

     {

           if (a.year < b.year)

               return 1;

           if (a.year > b.year)

              return -1;

           else

           return 0;

     } 

}

 

class Host

 {

        static void Main(string[] args)

         {

            // Create an arary of Car objects.     

             Car[] arrayOfCars =newCar[6]

            {

                   newCar("Ford",1992),        

                   newCar("Fiat",1988),

                   newCar("Buick",1932),         

                   newCar("Ford",1932),

                   newCar("Dodge",1999),       

                   newCar("Honda",1977)

            };

 

        // Write out a header for the output.

        Console.WriteLine("Array - Unsorted\n");

           foreach (Car cin arrayOfCars)       

               Console.WriteLine(c.Make +"\t\t" + c.Year);

 

        // Demo IComparable by sorting array with "default" sort order.   

        Array.Sort(arrayOfCars);         

        Console.WriteLine("\nArray - Sorted by Make (Ascending - IComparable)\n");

          foreach (Car c in arrayOfCars)

            Console.WriteLine(c.Make +"\t\t" + c.Year);

 

        // Demo ascending sort of numeric value with IComparer.

        //类Car 通过嵌套类提供了几种其它方式的sort。通常情况下这些自定义排序要放在client端,因为

        //server端通常无法精确确定客户端的要求。

        Array.Sort(arrayOfCars,Car.sortYearAscending());

        Console.WriteLine("\nArray - Sorted by Year (Ascending - IComparer)\n");

          foreach (Car c in arrayOfCars)

           Console.WriteLine(c.Make +"\t\t" + c.Year);

 

        // Demo descending sort of string value with IComparer.

        Array.Sort(arrayOfCars,Car.sortMakeDescending());

           Console.WriteLine("\nArray - Sorted by Make (Descending - IComparer)\n");

        foreach (Car cin arrayOfCars)

                Console.WriteLine(c.Make +"\t\t" + c.Year);

 

         // Demo descending sort of numeric value using IComparer.

        IComparer<Car> cpr = new sortYearDescendingHelper();
        Array.Sort(arrayOfCars, cpr);          

           Console.WriteLine("\nArray - Sorted by Year (Descending - IComparer)\n");

           foreach (Car c in arrayOfCars)

                 Console.WriteLine(c.Make +"\t\t" + c.Year);

 

        Console.ReadLine();

        }

}

//Car

 

public class Car :IComparable<Car>

 {

        

// Beginning of nested classes.

 

// Nested class to do ascending sort on year property.

     private class sortYearAscendingHelper :IComparer<Car>

 

    {

            int IComparer<Car>.Compare(Car a, Car b)

            {

                if (a.year > b.year)

                   return 1;

                    if (a.year < b.year)

                          return -1;

                else

                   return 0;

            }

     }

        

// Nested class to do descending sort on make property.

   private class sortMakeDescendingHelper :IComparer<Car>

    {

        int IComparer<Car>.Compare(Car a, Car b)

        {

             returnString.Compare(b.make, a.make);

         }

   }

        

// End of nested classes.

 

privateint year;

privatestring make;

 

        

   public Car(string Make, int Year)

   {

            make = Make;

            year = Year;

    }

        

    publicint Year

    {  

           get {return year; }       

           set { year =value; }

     }

        

  public string Make

   {          

         get {return make; }       

         set { make =value; }

   }

        

     // Implement IComparable CompareTo to provide default sort order.     

     int IComparable<Car>.CompareTo(Car other)

    {

            return String.Compare(this.make, other.make);

   }

        

   int CompareTo(Car other)

   {         

           returnString.Compare(this.make, other.make);

   }

        

// Method to return IComparer object for sort helper.    

   public static IComparer<Car> sortYearAscending()

   {          

         return (IComparer<Car>)newsortYearAscendingHelper();

  }

        

// Method to return IComparer object for sort helper.      

 public static IComparer<Car> sortYearDescending()

   {        

         return (IComparer<Car>)newsortYearDescendingHelper();

   }

}  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值