C# 比较和排序(IComparable和IComparer以及它们的泛型实现)
准备工作:
1.创建实体类:ClassInfo,默认想要对其按照班级学生数量进行排序
public class ClassInfo
{
/// <summary>
/// 班级名称
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// 学生数量
/// </summary>
public int StudentCount { get; set; }
}
2.在控制台程序Main方法中,插入代码
List<ClassInfo> classList = new List<ClassInfo>();
classList.Add(
new ClassInfo()
{
ClassName = "小一班",
StudentCount = 40
});
classList.Add(new ClassInfo()
{
ClassName = "小二班",
StudentCount = 39
});
foreach(var o in classList){
Console.WriteLine(string.Format("{0}:{1}", o.ClassName, o.StudentCount));
}
Console.ReadKey();
运行后,发现是按照增加对象的顺序来显示的。
3.尝试使用对象默认的Sort进行排序
classList.Sort();
报错,错误信息提示:必须至少有一个对象实现 IComparable。那么,如何实现自定义实体类的排序呢?下面开始一一陈述。
基本概念
比较:两个实体类之间按>,=,<进行比较。
排序:在集合类中,对集合类中的实体进行排序。排序基于的算法基于实体类提供的比较函数。
C#对基本类型都提供了默认的比较和排序的算法,但比较复杂结构的实体类,需要用户自己实现比较和排序的方法
1.IComparer
在ClassInfo类中,继承接口IComparer( IComparable<ClassInfo>),并实现接口中的CompareTo方法。
public int CompareTo(ClassInfo o)
{
return StudentCount.CompareTo(o.StudentCount);
}
运行,发现按照学生数量进行了升序显示。
注意上面代码中CompareTo方法,是利用了整型的默认比较方法。此处可以使用以下自定义代码,可以将比较器的工作原理阐述的更清楚。
if (StudentCount > o.StudentCount)
return 1;
else if (StudentCount == o.StudentCount)
return 0;
else
return -1;
2.IComparer:使用IComparer来实现一个自定义的比较器
public class SortByName : IComparer<ClassInfo>
{
public int Compare(ClassInfo x, ClassInfo y)
{
return x.ClassName.CompareTo(y.ClassName);
}
}
将Main()中,classList.Sort()改为 classList.Sort(new SortByName());
运行后,发现集合中的数据按名称进行了排序。
3.使用lamda表达式实现比较排序:
classList.Sort((ClassInfo obj1, ClassInfo obj2) => { return obj1.ClassName.CompareTo(obj2.ClassName); });
C# 比较和排序(IComparable和IComparer以及它们的泛型实现)的更多相关文章
- 比较和排序(IComparable和IComparer以及它们的泛型实现)(转)
C#笔记25:比较和排序(IComparable和IComparer以及它们的泛型实现) 本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparabl ...
- 比较和排序(IComparable和IComparer以及它们的泛型实现)
本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparable和IComparer的泛型实现IComparable<T>和ICompare ...
- 比较和排序 IComparable And IComparer
1.List<Student>默认排序 为类创建默认排序实现IComparable,此代码的实现为年龄升序 using System; using System.Collections.G ...
- 数组自定义排序:IComparable和IComparer接口
首先先说一下IComparable和IComparer的区别,前者必须在实体类中实现,后者可以单独出现在一个排序类中,即此类只包含一个compare方法. Array类使用快速算法对数组中的元素进行排 ...
- c# 实现IComparable、IComparer接口、Comparer类的详解
在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...
- C# 常用接口学习 IComparable 和 IComparer
C# 常用接口学习 IComparable 和 IComparer 作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 201 ...
- C# 中的IComparable和IComparer
前言 在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具 ...
- [0] 关于IComparable和IComparer接口和Comparer类
关于IComparable和IComparer接口 和 Comparer类 IComparable和ICompareframeworkr接口是.net 中比较对象的标准方式,这两个接口之间的区别如下: ...
- C#的 IComparable 和 IComparer接口及ComparableTo方法的 区别(非常重要)
(1)https://blog.csdn.net/ios99999/article/details/77800819 C# IComparable 和 IComparer 区别 (2)https:// ...
随机推荐
- 铁大Facebook轻量化界面NABCD
界面轻量化: N:满足了用户更快速.更直接.更方便寻求自己所要信息的需求,不被复杂界面以及各种广告所困扰. A:我们将会用Bootstrap工具包开发前端界面,Bootstrap是基于jQuery框架 ...
- 初步接触gulp
首先是安装nodejs,通过nodejs的npm全局安装和项目安装gulp,其次在项目里安装所需要的gulp插件,然后新建gulp的配置文件gulpfile.js并写好配置信息(定义gulp任务),最 ...
- 字体图标库 IcoMoon IconFont Font Awesome的使用
在项目开发的过程中,我们会经常用到一些图标.但是我们在使用这些图标时,往往会遇到失真的情况,而且图片数量很多的话,页面加载就越慢.所以,我们可以使用字体图标的方式来显示图标,字体图标任意放大缩小不会失 ...
- Analysis servlet
@WebServlet("/cdiservlet") public class NewServlet extends HttpServlet { private Message m ...
- 3.4 自动测试初步《精通ASP.NET MVC 5》
概述 ASP.NET MVC 框架已被设计成易于建立自动测试,并易于采用诸如测试驱动开发(TDD)等的开发方法学.ASP.NET MVC 为自动化测试提供了一个理想平台. 从广义上讲,当今的 Web ...
- 微信里iphone后退不刷新问题解决方案
$(function() { pushHistory(); }); function pushHistory() { window.addEventListener("popstate&qu ...
- DomeOS部署
http://gitbook.domeos.org/ 按照官方一键部署脚本完之后,发现监听的IP地址是在IPv6上面. vim /etc/default/grubadd ipv6.disable=1 ...
- Property Exercise
要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构 3 with open('user.db','w') as write_file:#创建并以写入的方式打开一个文件 ...
- Saku实力挖坑记!!(十八)
Saiku实力挖坑记!!!!!!! 我可真真真的是个挖坑小能手呀!不知道你们有没有遇到过这个异常: Enclosure class mondrian.olap.MondrianDef not foun ...
- python1-集合、函数-(全局变量与局部变量)
集合 # s=set('hello')# print(s)## s=set(['alex','alex','sb'])# print(s) # s={1,2,3,4,5,6} #添加# s.add(' ...