详述IComparer,IComparable接口,实现自定义方法比较对象大小并排序(C#)
详述IComparer,IComparable接口,实现自定义方法比较对象大小并排序(C#)
IComparable 接口
定义一种特定于类型的通用比较方法,值类型或类通过实现此方法对其实例进行排序。 此接口由具有可排序值的类型实现。它要求实现类型定义单个方法 CompareTo,该方法指示当前实例在排序顺序中的位置是位于同一类型的另一个对象之前、之后还是与其位置相同。实例的 IComparable 实现由诸如 Array..::.Sort 这样的方法自动调用。 所有数值类型(如 Int32 和 Double)均实现 IComparable,这一点与 String、 Char 和 DateTime 是相同的。此外,自定义类型还应提供自己的 IComparable 实现,以便可以对对象实例进行排序。 // Summary:
// 定义通用的比较方法,由值类型或类实现以创建类型特定的比较方法。 [ComVisible(true)] public interface IComparable { // Summary: // 比较当前实例与同一类型的另一对象。 // // Parameters: // obj: // 与此实例进行比较的对象。 // // Returns: // 一个 32 位有符号整数,指示要比较的对象的相对顺序。返回值的含义如下: 值 含义 小于零 此实例小于 obj。 零 此实例等于 obj。 大于零 // 此实例大于 obj。 // // Exceptions: // System.ArgumentException: // obj 不具有与此实例相同的类型。 int CompareTo(object obj); }
此接口与Array.Sort 和 Array.BinarySearch 方法一起使用。它提供一种自定义集合排序顺序的方法。 // 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();
参考文档:
C#.Net自定义控件 - GridPopupContainerEdit C#.Net自定义控件 - CheckedListBoxEditor(支持多值勾选及新增) C#.Net自定义控件设置图标ToolboxBitmap的用法 C#.Net用户自定义控件制作教程 GridView实现自定义按钮及中间插入记录排序功能 C#开发自定义控件-设置显示工具箱中的图标 C#.Net开发继承UITypeEditor接口的自定义属性编辑器 C#.Net组件开发 - 设计时使用自定义属性编辑器持久化对象 标签:C#.Net组件开发 - 属性窗体内显示自定义名称 标签:C#.Net组件开发 - 自定义设计器(ComponentDesigner) 标签:C#.Net组件开发 - 自定义设计器持久化对象的属性 标签:C#.Net组件开发 - 自定义属性编辑器持久化对象的属性 C#.Net组件开发(高级篇) - 自定义CollectionEditor编辑器 C#.Net组件开发(高级篇) - 使用自定义TypeConverter生成设计时代码 C# GridView 自定义单元格的背景色
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |