详述IComparer,IComparable接口,实现自定义方法比较对象大小并排序(C#)
作者:C/S框架网  发布日期:2011/07/13 23:13:36
详述IComparer,IComparable接口,实现自定义方法比较对象大小并排序(C#)



IComparable 接口

定义一种特定于类型的通用比较方法,值类型或类通过实现此方法对其实例进行排序。

此接口由具有可排序值的类型实现。它要求实现类型定义单个方法 CompareTo,该方法指示当前实例在排序顺序中的位置是位于同一类型的另一个对象之前、之后还是与其位置相同。实例的 IComparable 实现由诸如 Array..::.Sort 这样的方法自动调用。

所有数值类型(如 Int32Double)均实现 IComparable,这一点与 String CharDateTime 是相同的。此外,自定义类型还应提供自己的 IComparable 实现,以便可以对对象实例进行排序。

IComparable接口原型

// Summary:
// 定义通用的比较方法,由值类型或类实现以创建类型特定的比较方法。
[ComVisible(true)]
public interface IComparable
{
   // Summary:
   // 比较当前实例与同一类型的另一对象。
   //
   // Parameters:
   // obj:
   // 与此实例进行比较的对象。
   //
   // Returns:
   // 一个 32 位有符号整数,指示要比较的对象的相对顺序。返回值的含义如下: 值 含义 小于零 此实例小于 obj。 零 此实例等于 obj。 大于零
   // 此实例大于 obj。
   //
   // Exceptions:
   // System.ArgumentException:
   // obj 不具有与此实例相同的类型。
   int CompareTo(object obj);
}


IComparer接口

此接口与Array.Sort Array.BinarySearch 方法一起使用。它提供一种自定义集合排序顺序的方法。

IComparer接口原型

// Summary:
// 公开一种比较两个对象的方法。
[ComVisible(true)]
public interface IComparer
{
   // Summary:
   // 比较两个对象并返回一个值,指示一个对象是小于、等于还是大于另一个对象。
   //
   // Parameters:
   // y:
   // 要比较的第二个对象。
   //
   // x:
   // 要比较的第一个对象。
   //
   // Returns:
   // 值 条件 小于零 x 小于 y。 零 x 等于 y。 大于零 x 大于 y。
   //
   // Exceptions:
   // System.ArgumentException:
   // x 和 y 都不实现 System.IComparable 接口。- 或 - x 和 y 的类型不同,它们都无法处理与另一个进行的比较。
   int Compare(object x, object y);
}

测试用源代码

汽车类定义,实现IComparable接口
//汽车基类,该类实现IComparer接口,可以与其它汽车比较型号
public class CarBase : IComparable
{
   protected string _modelNo = "";
   
   //汽车型号
   public string ModelNo { get { return _modelNo; } set { _modelNo = value; } }
   
   //汽车比较
   public int CompareTo(object obj)
   {
      if (obj is CarBase)
      {
         CarBase car = obj as CarBase;//转换对象
         
         return this._modelNo.CompareTo(car.ModelNo); //比较汽车型号,IComparable接口的用处就在这里.
      }
      else
      throw new Exception("类型不匹配,必须是CarBase类型的对象!");
   }
}

//马自达III(马3)
public class CarMazidaIII : CarBase
{
   public CarMazidaIII()
   {
      _modelNo = "M3-2006"; //马自达III(马3)
   }
}

//马自达6(马6)
public class CarMazida6 : CarBase
{
   public CarMazida6()
   {
      _modelNo = "M6-2008"; //马自达6(马6)
   }
}

//奔驰 X8型号汽车
public class CarBenzX8 : CarBase
{
   public CarBenzX8()
   {
      _modelNo = "Benz X8"; //奔驰 X8型号汽车
   }
}

汽车汽车比较类CarComparer,实现IComparer接口
//汽车比较类,实现IComparer接口,通过Compare方法比较汽车大小
public class CarComparer : IComparer
{
   //比较两个对象并返回一个值,指示一个对象是小于、等于还是大于另一个对象。
   //返回值<0表示:x小于y
   //返回值=0表示:x等于y
   //返回值>0表示:x大于y
   public int Compare(object x, object y)
   {
      if (x is CarBase && y is CarBase)
      {
         CarBase car1 = x as CarBase;
         CarBase car2 = y as CarBase;
         
         //比较方式1,因为CarBase实现IComparable接口,所以调用CompareTo直接比较
         return car1.CompareTo(car2);
         
         //比较方式2,假设CarBase没有CompareTo方法,那么可以比较汽车型号。
         // return car1.ModelNo.CompareTo(car2.ModelNo);
      }
      else
      throw new Exception("类型不匹配,必须是CarBase类型的对象!");
   }
}


测试用例
//测试IComparer,IComparable接口的类
public class IComparableClass
{
   public void Test()
   {
      CarBase m3 = new CarMazidaIII();
      CarBase m6 = new CarMazida6();
      CarBase x8 = new CarBenzX8();
      
      //马3与马6比较
      int i = m3.CompareTo(m6);//返回:
      Console.WriteLine(i.ToString());
      
      object[] cars = new object[] { m6, x8, m3 };//汽车数组,用于排序,现在是无序状态
      
      //显示排序前汽车型号
      foreach (CarBase car in cars)
      Console.WriteLine(car.ModelNo);
      
      //使用自定义比较类进行排序
      Array.Sort(cars, new CarComparer());
      
      Console.WriteLine("=================================");
      
      //显示排序后的汽车型号
      foreach (CarBase car in cars)
      Console.WriteLine(car.ModelNo);
      
      Console.WriteLine("比较完成 by www.csframework.com");
   }
}

测试方法:

new
IComparableClass().Test();


上一篇 下一篇