最新要闻
- 全球看点:4月26日西南地区乙醇市场行情震荡整理
- 大范围降雨将重启 暴雨袭击6省:覆盖五一假期 环球即时看
- 特斯拉Autopilot每917万公里才一起事故:比人驾安全性高773% 世界新动态
- 旅美大熊猫“丫丫”将于当地4月26日归国:身体健康状态相对平稳
- 三星Exynos 2400回归!性能爆发 剑指高通骁龙8 Gen3-世界快讯
- 世界视点!撕掉油腻 三重功效:凯迪克男士洗面奶280g装19.9元
- 天天观天下!剪窗花的来历和故事_剪窗花的来历
- 市场监管总局:对明显违法违规的主播和商家要依法严厉处罚-全球最资讯
- 旅游不怕价格刺客!淘宝上线海淘“外挂”:拍照找同款比价 热点聚焦
- 烧烤火出圈 淄博致游客的一封信:客流量已超出接待能力-天天微头条
- 悲痛!一名8岁女孩脸部遇手机爆炸后身亡 官方正调查
- 物业业主联手助力孩子圆梦
- 俞敏洪:猪周期与人生周期相似 坚守最可贵
- 全球微动态丨寿司店疑现被煮熟蓝环章鱼 店家要求爆料网友删博:市监局已介入
- Web3来了!蚂蚁链宣布开源跨链技术:数字资产互联互通
- 微软将以690亿美元收购动视暴雪:有望于本周获批|当前热闻
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
[译]在C#中使用IComparable和IComparer接口 每日短讯
原文: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
关键词:
-
[译]在C#中使用IComparable和IComparer接口 每日短讯
本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口类似且名称相似
来源: -
(二)asyncio的简单使用,python异步高效处理数据,asyncio.get_event_loop(),loop.run_until_complete(
Asyncio是一个基于事件循环的异步I O框架,它提供了高效的协程实现,能够轻松地编写高并发的Python程序。As
来源: 在毫秒量级上做到“更快”!DataTester 助力飞书提升页面秒开率
[译]在C#中使用IComparable和IComparer接口 每日短讯
(二)asyncio的简单使用,python异步高效处理数据,asyncio.get_event_loop(),loop.run_until_complete(
全球看点:4月26日西南地区乙醇市场行情震荡整理
大范围降雨将重启 暴雨袭击6省:覆盖五一假期 环球即时看
特斯拉Autopilot每917万公里才一起事故:比人驾安全性高773% 世界新动态
旅美大熊猫“丫丫”将于当地4月26日归国:身体健康状态相对平稳
三星Exynos 2400回归!性能爆发 剑指高通骁龙8 Gen3-世界快讯
世界视点!撕掉油腻 三重功效:凯迪克男士洗面奶280g装19.9元
天天观天下!剪窗花的来历和故事_剪窗花的来历
市场监管总局:对明显违法违规的主播和商家要依法严厉处罚-全球最资讯
旅游不怕价格刺客!淘宝上线海淘“外挂”:拍照找同款比价 热点聚焦
烧烤火出圈 淄博致游客的一封信:客流量已超出接待能力-天天微头条
悲痛!一名8岁女孩脸部遇手机爆炸后身亡 官方正调查
接单日记(一):理解浮点数运算的误差
物业业主联手助力孩子圆梦
俞敏洪:猪周期与人生周期相似 坚守最可贵
全球微动态丨寿司店疑现被煮熟蓝环章鱼 店家要求爆料网友删博:市监局已介入
Web3来了!蚂蚁链宣布开源跨链技术:数字资产互联互通
微软将以690亿美元收购动视暴雪:有望于本周获批|当前热闻
全面实行不动产统一登记制,房产税真的要来了? 全球要闻
【环球速看料】从数据库查询权限信息与自定义失败处理
每日观点:【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it
亿级日活业务稳如磐石,华为云CodeArts PerfTest发布
深入思考右值引用
看点:Java中抽象类和接口的区别?
世界即时:宿州:全市采血点无休 库存现缺A型、o型血
传统车企掀桌子!20.89万起的别克E5太香了:累计订单已超8000份 每日焦点
小鹏P7停车礼让 随后看呆:老奶奶5秒跑过斑马线还竖大拇指-世界微速讯
手机创史上最大降幅 回收成香饽饽:“暴利”超乎想象 焦点消息
天天微头条丨年轻人的首台超联接笔记本 华为MateBook D 14开卖 首销购机享福利
五一小长假来了!滴滴宣布发2亿司机补贴:假期出车流水加速
dota如何踢人?dota怎么设置快捷键?
今日视点:4月26日浙江蓝苏氟化工氢氟酸价格暂稳
半成品加工是什么意思?半成品加工需要办什么证件?
nba fmvp是什么意思?fmvp是怎么评出来的?
50米自由泳世界纪录是多少?50米自由泳一二三级运动员标准
诺基亚5320当年多少钱?诺基亚5320手机参数
苹果一体机怎么开机?苹果一体机电脑型号大全列表
诺基亚820怎么连接电脑?诺基亚820手机参数
当前观点:使用pycuda替换字符串,使用cuda替换字符串
python 使用selenium 不开启浏览器
今日热议:C# 获取系统DPI缩放比例以及分辨率大小
TF-GNN踩坑记录(四) 全球报道
CentOS搭建squid正向代理|当前热门
全球即时:据说,有一群AI数字人将在AWE展会觉醒......
增城是哪里的城市?增城旅游必去十大景点
联通iphone合约机划算吗?联通iphone语音信箱怎么关闭?
电信网络模式有哪几种?电信网络模式怎么设置?
【金融街发布】财政部:3月全国发行地方政府债券8900亿元
守住“头顶上的安全”, 长征镇加强房屋高坠隐患排查整治|当前时讯
微信支付支持数字人民币支付了:视频号、小程序可用
【世界新视野】丰田社长体验中国顶级豪车红旗L5:满脸堆笑、不住称赞
99年女子疑过度劳累宿舍猝死 公司:逝者是临时工
280g新疆长绒棉:Caria Knar纯棉T恤29.99元(减110元)
【全球新视野】NVIDIA推出安全“护栏”:限制人工智能“一本正经的胡扯”
22家上市后备企业蓄势待发!永兴经开区优化营商环境促发展-新视野
Java基础之String字符串的底层原理,面试常见问题
当前速读:error: Your local changes to the following files would be overwritten by me
Java8 教程_编程入门自学教程_菜鸟教程-免费教程分享
天天观焦点:兰州高新区重点项目建设实现一季度开门红
中金湖北科投光谷REIT正式获批 全球信息
全球视讯!华为MateBook D14/D16今日开售:13代酷睿 4999元起
有人姓“苟”:担心孩子受嘲笑而改姓_环球新视野
天天日报丨五一假期用得着!冈本okamoto超薄安全套大促:立省60元
全球观热点:国产鼠标卷疯了 200元碾压千元国际大牌
黄海附近发生4.8级地震:上海等地有震感 焦点播报
天天热门:洞口县:刘玮到江口镇调研督导工作,与结对帮带年轻干部谈心谈话
记一次某应用虚拟化系统远程代码执行
【当前独家】JavaScript设计模式
每日速读!Pipelines
Spring Boot 项目代码混淆,实战来了,再也不用担心代码泄露了!
重庆警方破获特大制售假冒汽车安全气囊案 涉案金额逾2亿元|天天热文
世界即时:*ST蓝盾股债或被双双强退 蓝盾转债或成第一只退市可转债
【财经分析】山东高速、湖北科投两单REITs获批 常态化发行进入快车道
中大盘蓝筹股成调研重点 热点企业AI业务受机构关注
全球速讯:天涯社区已无法打开:网友掀悼念潮
《原神》开发商最新力作!米哈游《崩坏:星穹铁道》今日公测 每日报道
天天精选!卫星通信首次下放!华为nova 11系列首销:2499元起
网传眉山夜市有人偷小孩?警方:男子并非人贩,疑用假币引纠纷 正进一步调查
速看:百亿级新投资项目此起彼伏 光伏头部企业加速“垂直一体化”布局
【国际大宗商品早报】经济衰退担忧回升 原油基本金属全线下跌
长三角楼市:3月量价齐升
1台利润是安卓机10倍!iPhone翻新机全球卖爆:系统不卡 保值好|环球快播报
天天观热点:比OLED更香!苹果即将商用MicroLED技术:不烧屏
学系统集成项目管理工程师(中项)系列12_干系人管理-焦点消息
十四届全国人大常委会举行第三次委员长会议,赵乐际主持-环球观天下
千元以下投影仪最好别买!原因揭开 世界看热讯
fastbin_tcache 环球热闻
【天天新视野】说好一个价,上门又加价——透析搬家等服务收费乱象
64核心!京东发布首款ARM云主机:性能飙升60% 还便宜50%-每日热文
曝光徐州旅游踩坑网红账号被举报:账号私信已被封
领先苹果7年!华为将推出无创血糖监测智能手表:识别率超85%|天天热闻
全球焦点!6月上映!《变形金刚7:超能勇士崛起》新海报发布:汽车人集结
【环球新要闻】当事人回应吐槽软卧3男1女被狂批:很不高兴 理性一些吧
【环球新要闻】国际锐评丨“先开枪,再开口”美国陷入了怎样的怪圈?
打印机测试页打印不出来(打印机测试页) 当前时讯
环球时讯:C语言程序设计知识点总结02
clion使用 wsl 编译下, 文件名和目录名冲突问题|全球即时
铁矿石主力合约跌破700关口_天天微速讯