原文:Use the IComparable and IComparer interfaces in Visual CSharp
【资料图】
本文介绍了在Visual C#中如何使用IComparer和IComparable接口。
概要
本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口类似且名称相似,但它们却有不同的用途。
如果你有一个支持IComparer的类型数组(例如字符串或整数),你可以对它进行排序而不需要提供任何对IComparer的显式引用(译注:意思是把一个IComparer的实现类作为参数传递给排序方法)。在这种情况下,数组元素会被转换为IComparer的默认实现(Comparer.Default)。然而,如果你想为自定义对象提供排序或比较能力,你必须实现这两个接口中的一个或两个。
本文引用了Microsoft .NET Framework类库命名空间System.Collections。
IComparable 接口
IComparable 接口的作用是提供一种比较特定类型的两个对象的方法。如果你想为你的对象提供任何排序能力,那么这是必须的。可以将 IComparable 视为为你的对象提供默认的排序顺序。例如,如果你有一个对象类型的数组,然后你在该数组上调用 Sort 方法,则排序期间的对象比较是由 IComparable 提供的。当你实现 IComparable 接口时,必须实现 CompareTo 方法,如下所示:
// IComparable 的 CompareTo 方法,提供默认的排序。int IComparable.CompareTo(object obj){ Car c=(Car)obj; return String.Compare(this.make,c.make);}
CompareTo 方法中如何进行比较取决于被比较值的数据类型。在本例中使用 String.Compare方法,因为被选择用于比较的属性是字符串。
IComparer 接口
IComparer 接口的作用是提供更多的比较机制。例如,你可能想要你的类的排序上使用多个字段或属性,在同一字段上提供升序和降序,或者两者兼而有之。(译注,这个时候就必须要使用IComparer 接口了。)
使用 IComparer 是一个两步过程。首先,声明一个实现 IComparer 的类,然后实现 Compare 方法:
private class SortYearAscendingHelper : IComparer{ int IComparer.Compare(object a, object b) { Car c1=(Car)a; Car c2=(Car)b; if (c1.year > c2.year) return 1; if (c1.year < c2.year) return -1; else return 0; }}
注意:
IComparer.Compare 方法需要三元比较。根据其中一个值是否大于、等于或小于另一个值,返回1、0或-1。可以通过切换此方法中的逻辑运算符来更改排序顺序(升序或降序)。
第二步是声明一个返回IComparer对象实例的方法:
public static IComparer SortYearAscending(){ return (IComparer) new SortYearAscendingHelper();}
在本例中,该对象被用作第二个参数被传递给Array.Sort的接受IComparer实例的重载方法。IComparer的使用并不局限于数组。它被许多不同的集合和控件类接受为参数。
逐步讲解的示例:
以下示例演示了如何使用这些接口。为了演示IComparer和IComparable,我们创建了一个名为Car的类,该类拥有Make和Year两个属性。通过IComparable接口,为Make字段启用了升序排序;通过IComparer接口,为Make字段启用了降序排序。通过使用IComparer,为Year属性提供了升序和降序排序。
1. 在Visual Studio中创建一个新的Console Application项目,把它命名为ConsoleEnum。
2. 将Program.cs重命名为Host.cs,然后用以下代码替换原有代码。
1 using System; 2 3 namespace ConsoleEnum 4 { 5 class host 6 { 7 [STAThread] 8 static void Main(string[] args) 9 {10 // Create an array of Car objects.11 Car[] arrayOfCars= new Car[6]12 {13 new Car("Ford",1992),14 new Car("Fiat",1988),15 new Car("Buick",1932),16 new Car("Ford",1932),17 new Car("Dodge",1999),18 new Car("Honda",1977)19 };20 21 // Write out a header for the output.22 Console.WriteLine("Array - Unsorted\n");23 24 foreach(Car c in arrayOfCars)25 Console.WriteLine(c.Make + "\t\t" + c.Year);26 27 // Demo IComparable by sorting array with "default" sort order.28 Array.Sort(arrayOfCars);29 Console.WriteLine("\nArray - Sorted by Make (Ascending - IComparable)\n");30 31 foreach(Car c in arrayOfCars)32 Console.WriteLine(c.Make + "\t\t" + c.Year);33 34 // Demo ascending sort of numeric value with IComparer.35 Array.Sort(arrayOfCars,Car.SortYearAscending());36 Console.WriteLine("\nArray - Sorted by Year (Ascending - IComparer)\n");37 38 foreach(Car c in arrayOfCars)39 Console.WriteLine(c.Make + "\t\t" + c.Year);40 41 // Demo descending sort of string value with IComparer.42 Array.Sort(arrayOfCars,Car.SortMakeDescending());43 Console.WriteLine("\nArray - Sorted by Make (Descending - IComparer)\n");44 45 foreach(Car c in arrayOfCars)46 Console.WriteLine(c.Make + "\t\t" + c.Year);47 48 // Demo descending sort of numeric value using IComparer.49 Array.Sort(arrayOfCars,Car.SortYearDescending());50 Console.WriteLine("\nArray - Sorted by Year (Descending - IComparer)\n");51 52 foreach(Car c in arrayOfCars)53 Console.WriteLine(c.Make + "\t\t" + c.Year);54 55 Console.ReadLine();56 }57 }58 }
3. 在项目中新增一个类,命名为Car。
4. 用下面的代码替换Car.cs中的代码。
1 using System; 2 using System.Collections; 3 namespace ConsoleEnum 4 { 5 public class Car : IComparable 6 { 7 // Beginning of nested classes. 8 // Nested class to do ascending sort on year property. 9 private class SortYearAscendingHelper: IComparer 10 { 11 int IComparer.Compare(object a, object b) 12 { 13 Car c1=(Car)a; 14 Car c2=(Car)b; 15 16 if (c1.year > c2.year) 17 return 1; 18 19 if (c1.year < c2.year) 20 return -1; 21 22 else 23 return 0; 24 } 25 } 26 27 // Nested class to do descending sort on year property. 28 private class SortYearDescendingHelper: IComparer 29 { 30 int IComparer.Compare(object a, object b) 31 { 32 Car c1=(Car)a; 33 Car c2=(Car)b; 34 35 if (c1.year < c2.year) 36 return 1; 37 38 if (c1.year > c2.year) 39 return -1; 40 41 else 42 return 0; 43 } 44 } 45 46 // Nested class to do descending sort on make property. 47 private class SortMakeDescendingHelper: IComparer 48 { 49 int IComparer.Compare(object a, object b) 50 { 51 Car c1=(Car)a; 52 Car c2=(Car)b; 53 return String.Compare(c2.make,c1.make); 54 } 55 } 56 // End of nested classes. 57 private int year; 58 private string make; 59 60 public Car(string Make,int Year) 61 { 62 make=Make; 63 year=Year; 64 } 65 66 public int Year 67 { 68 get {return year;} 69 set {year=value;} 70 } 71 72 public string Make 73 { 74 get {return make;} 75 set {make=value;} 76 } 77 // Implement IComparable CompareTo to provide default sort order. 78 int IComparable.CompareTo(object obj) 79 { 80 Car c=(Car)obj; 81 return String.Compare(this.make,c.make); 82 } 83 // Method to return IComparer object for sort helper. 84 public static IComparer SortYearAscending() 85 { 86 return (IComparer) new SortYearAscendingHelper(); 87 } 88 // Method to return IComparer object for sort helper. 89 public static IComparer SortYearDescending() 90 { 91 return (IComparer) new SortYearDescendingHelper(); 92 } 93 // Method to return IComparer object for sort helper. 94 public static IComparer SortMakeDescending() 95 { 96 return (IComparer) new SortMakeDescendingHelper(); 97 } 98 99 }100 }
5. 运行项目。Console窗口显示如下:
Array - UnsortedFord 1992Fiat 1988Buick 1932Ford 1932Dodge 1999Honda 1977Array - Sorted by Make (Ascending - IComparable)Buick 1932Dodge 1999Fiat 1988Ford 1932Ford 1992Honda 1977Array - Sorted by Year (Ascending - IComparer)Ford 1932Buick 1932Honda 1977Fiat 1988Ford 1992Dodge 1999Array - Sorted by Make (Descending - IComparer)Honda 1977Ford 1932Ford 1992Fiat 1988Dodge 1999Buick 1932Array - Sorted by Year (Descending - IComparer)Dodge 1999Ford 1992Fiat 1988Honda 1977Buick 1932Ford 1932
标签:
上一篇 : 今日热文:全志科技(300458):该股换手率大于8%(04-26)
下一篇 : 最后一页
航拍浮梁县的广袤田园,连片农田与村落、青山、村道以及正在建设中的昌景黄高铁,构成了一幅秀美画卷。
04-26 15:10:32
朱琳现在虽然排名还未进世界前三十,但是从目前她的情况来看,今年赛季结束世界排名进入前三十,应该没有太
04-26 15:05:55
4月24日,青岛银行发布公告称,王瑜因工作调动,根据组织安排辞去副行长职务。补位人选同时公布,青岛银行
04-26 14:11:24
北京时间4月25日,2022-23赛季NBA季后赛继续首轮争夺,太阳主场136-130击败快船,总比分4-1淘汰对手。接下
04-26 13:51:15
可以。一毛硬币可以去银行换整钱的,银行为公民提供了合理的货币兑换服务,用户可以带着自己的身份证、银行
04-26 13:15:43
4月26日,远洋资本有限公司发布2021年公开发行创新创业公司债券(第一期)不行使发行人赎回选择权的公告。
04-26 12:46:09
中证网讯(记者齐金钊)日前,同和药业披露2022年年报和2023年一季报。2022年,公司实现营收7 2亿元,同比增
04-26 11:51:31
1、一,属冷色二,外黑色内橄榄色对肤色发黄。2、发黑的都适合的。本文到此分享完毕,希望对大家有所帮助。
04-26 11:48:55
【手机中国新闻】在智能手机行业,如果说有什么技术发展飞快,那一定是快充技术。目前,很多厂商都在更新快
04-26 11:19:37
同花顺数据中心显示,汇创达4月25日获融资买入241 46万元,占当日买入金额的10 29%,当前融资余额7185 55万
04-26 11:05:42
火电比重将首次低于50%
04-26 10:46:34
哪款牌子沐浴露留香持久,相信每个人都希望自己用沐浴乳洗一个香喷喷的澡,但是有时我们洗了澡没多久沐浴乳
04-26 10:16:22
四月芳菲,春到陇原。甘肃省金川镍钴研究设计院有限责任公司传来捷报:硫酸镍绿色冶炼关键共性技术和装备研
04-26 10:11:29
4月24日,崇阳县第十二届提琴戏剧节在天城剧院开幕。提琴戏作为特色文化品牌,已根植在广大民众心中,唱响
04-26 09:41:23
4月26日,生意社线材基准价为3990 00元 吨,与本月初(4418 00元 吨)相比,下降了-9 69%。线材年度统计(2022-04-26--2023
04-26 09:04:09
近日,中国气象服务协会发布了第二批“天气气候景观观赏地”,安徽省宁国市落羽杉湿地红叶、霍山县屋脊...
04-26 08:34:01
1、共用基础设施,节约基建投资和降低生产成本工业集聚带来的好处:①大规模和联合企业生产具有较高的经济
04-26 08:03:12
从湘湖绿道到呼伦贝尔大草原“追风”的跑团杭州网发布时间:2023-04-2606:50杭州日报讯早上7点不到,湘湖景
04-26 07:09:03
近日,大连消防支队在金普新区一油库举行了利用机器人扑灭油罐大火的演练,当天,14台机器人,32台消防车,
04-26 06:12:27
罗体:穆里尼奥搬家和未来去留无关,只想更靠近训练基地专注工作,罗马,罗体,阿奎拉尼,何塞·穆里尼奥
04-26 05:11:17
欢迎观看本篇文章,小柴来为大家解答以上问题。使徒行者3演员表介绍,使徒行者3演员表角色介绍很多人还不知
04-26 03:42:29
最高人民检察院25日公布,台湾犯罪嫌疑人杨智渊涉嫌分裂国家罪一案,由浙江省温州市国家安全局侦查终结,移
04-26 02:05:35
继第二轮埃德米尔森补时第2分钟打入补时绝平球之后,卫冕冠军武汉三镇队在中超第三轮终于迎来联赛新赛季首
04-26 00:05:50
美国3月新屋销售总数年化录得63万户,预期63万户,前值64万户,为2022年3月以来新高。
04-25 23:05:03
中国山东网-感知山东4月25日讯(记者葛婷婷)近日,济南市历下区人民检察院依法向区法院提起公诉的李某某涉
04-25 22:01:38
【乘联会:4月新能源零售销量预计50万辆环比下降8 4%】4月狭义乘用车零售销量预计157 0万辆,环比-1 3%,受
04-25 21:30:06
1、我想沒有有喜歡誰吧,他只是一個奈落的一個分身,不會喜歡上誰的白童子谁也不喜欢,他没有感情,他只是奈
04-25 20:50:29
4月25日电,中国武夷发布2023年一季度报告,实现营业收入6 17亿元,同比下降30 20%;归属于上市公司股东的净利
04-25 20:17:46
【欧盟呼吁企业联合购买天然气将展开全球招标】据央视新闻消息,当地时间4月25日,欧盟委员会启动行政流程
04-25 19:42:46
1、化学式中各原子的相对原子质量的总和,就是相对分子质量(Relativemolecularmass),用符号Mr表
04-25 19:13:04
广东交通集团所属二广高速预测,“五一”假期全线出口车流量日均约13万车次,同比增长43%,以中长途旅游...
04-25 18:32:37
粉笔有限公司发布2022年年度报告。财报显示,粉笔全年实现营收28 1亿元,毛利润13 66亿元,经调整利润1 91
04-25 18:13:29
2023年公募基金一季报分析:主动权益基金仓位上升重仓增配TMT
04-25 17:52:33
据《世界体育报》报道,C罗与女友乔治娜出现了感情危机。葡萄牙天王对自己的伴侣有所不满。此外,本周葡萄
04-25 17:28:03
今年以来,包头稀土高新区加快稀土产业资源和科技力量集聚步伐,积极引进有利于延链、强链、补链、壮链的稀
04-25 16:44:32
昨天(4月24日)上午,江宁天印大道北延工程跨秦淮东河大桥主桥段最后一跨箱梁顶板浇筑完成,标志着该桥主
04-25 16:10:04
1、治疗原则2、一般疗法本文到此结束,希望对大家有所帮助。
04-25 15:51:01
1、许佳琪,1995年8月27日出生于浙江省,中国内地流行乐女歌手、影视演员,SNH48一期生,SNH48TeamSII成员
04-25 15:25:20
市值暴跌60%,大客户砍单究竟对歌尔的影响有多大?有网友吐槽:再也不买供应链股票了……近年来,进入水...
04-25 15:06:31
通威股份(600438):业绩高速增长龙头地位稳固
04-25 14:47:20
永吉县沙家村:脱贫户养鹅致富,振兴路越走越宽
04-25 14:04:11
4月24日,由中国残联主办,中国残疾人体育运动管理中心承办的新周期2023年冬残奥运动员选拔训练营举行闭营
04-25 13:50:07
快科技4月25日消息,摩托罗拉之前已经官宣了motorazr2023,宣称“无公摊大外屏,超高得屏率”。联想陈劲今
04-25 13:42:44
1、广西理工高职专业有哪些专业广西理工职业技术学院在崇左,这个学校是民办的……………,要读计算机专...
04-25 13:20:33
1、宋清富(1954年-1976年11月),男,陕西省山阳县人。2、生前是84516部队战士,1976年11月在
04-25 12:46:59
OPPO超影像大赛于2023年4月21日开启「山河奇境」月度作品征集活动(以下简称“征集活动”),现已正式面...
04-25 12:31:56
双碳背景下,光伏产业步入高质量发展的关键时期,争做光伏领域颠覆者的爱旭数字能源,选择先人一步,开启分布式
04-25 12:19:17
锂价下挫,带崩上市公司业绩。详情
04-25 12:20:01
上证报中国证券网讯4月24日晚间,阳光电源发布2022年年度报告。报告期内,公司营业收入达402 57亿元,同比
04-25 12:06:07
广州大学位于广东省广州市,是广东省、广州市重点建设的综合性大学,实行省市共建、以市为主的办学体制,是
04-25 11:48:52
航拍浮梁县的广袤田园,连片农田与村落、青山、村道以及正在建设中的昌景黄高铁,构成了一幅秀美画卷。
2023-04-26
朱琳现在虽然排名还未进世界前三十,但是从目前她的情况来看,今年赛季结束世界排名进入前三十,应该没有太
2023-04-26
4月24日,青岛银行发布公告称,王瑜因工作调动,根据组织安排辞去副行长职务。补位人选同时公布,青岛银行
2023-04-26
北京时间4月25日,2022-23赛季NBA季后赛继续首轮争夺,太阳主场136-130击败快船,总比分4-1淘汰对手。接下
2023-04-26
可以。一毛硬币可以去银行换整钱的,银行为公民提供了合理的货币兑换服务,用户可以带着自己的身份证、银行
2023-04-26
Copyright © 2015-2022 热讯纤维网版权所有 备案号:豫ICP备20005723号-6 联系邮箱:29 59 11 57 8@qq.com