IComparable和IComparer接口
C#中,自定义类型,支持比较和排序,需要实现IComparable接口。IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表示当前对象大于被比较对象,0表示两者相等,-1表示当前对象小于被比较对象。
public int CompareTo(object o) {}
若想以更加灵活的方式对自定义类进行比较,可以声明一个继承自IComparer接口的比较器,实现接口方法Comprae(),接收2个object类型参数作为比较对象,返回整型值:1表示前者大于后者,0表示两者相等,-1表示前者小于后者。
public int Compare(object x, object y) {}
IComparable是“可比较的”意思,自定义类实现该接口,就具有可比较的功能;IComparer是“比较器”的意思,实现该接口的类就是一个比较器,可以将比较器“注入”类中,使类具有比较和排序的功能。
IComparable接口示例代码
定义学生类,该类实现IComparable接口的CompareTo方法,该方法对Age 进行大小比较。
public class Student : IComparable
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public int CompareTo(object obj)
{
Student stu = obj as Student;
if (Age > stu.Age)
{
return ;
}
else if (Age == stu.Age)
{
return ;
}
else
{
return -;
}
}
}
调用List<T>.Sort方法实现stuList按照学生的年龄来排序。
static void Main(string[] args)
{
List<Student> stuList = new List<Student>();
stuList.Add(new Student() { Name = "tiana0", Sex = "Man", Age = });
stuList.Add(new Student() { Name = "tiana1", Sex = "Woman", Age = });
stuList.Add(new Student() { Name = "tiana2", Sex = "Woman", Age = });
stuList.Add(new Student() { Name = "tiana3", Sex = "Man", Age = });
stuList.Add(new Student() { Name = "tiana4", Sex = "Woman", Age = });
stuList.Sort();
foreach (Student stu in stuList)
{
Console.WriteLine("Name=" + stu.Name + ";Sex=" + stu.Sex + ";Age=" + stu.Age);
}
}
IComparer接口示例代码
定义学生类。
public class Student
{
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
}
自定义比较器AgeComparer,实现接口IComparer<Student>,对学生年龄进行比较。
public class AgeComparer : IComparer<Student>
{
public int Compare(Student x, Student y)
{
return x.Age.CompareTo(y.Age);
}
}
自定义比较器NameComparer,实现接口IComparer<Student>,对学生姓名进行比较。
public class NameComparer : IComparer<Student>
{
public int Compare(Student x, Student y)
{
return x.Name.CompareTo(y.Name);
}
}
调用List<T>.Sort方法实现stuList按照学生的年龄与姓名排序。
static void Main(string[] args)
{
List<Student> stuList = new List<Student>();
stuList.Add(new Student() { Name = "aki", Sex = "Man", Age = });
stuList.Add(new Student() { Name = "cki", Sex = "Woman", Age = });
stuList.Add(new Student() { Name = "dki", Sex = "Woman", Age = });
stuList.Add(new Student() { Name = "bki", Sex = "Man", Age = });
stuList.Add(new Student() { Name = "fki", Sex = "Woman", Age = });
stuList.Sort(new AgeComparer());
Console.WriteLine("按照年龄排序:");
foreach (Student stu in stuList)
{
Console.WriteLine("Name=" + stu.Name + ";Sex=" + stu.Sex + ";Age=" + stu.Age);
}
stuList.Sort(new NameComparer());
Console.WriteLine();
Console.WriteLine("按照名称排序:");
foreach (Student stu in stuList)
{
Console.WriteLine("Name=" + stu.Name + ";Sex=" + stu.Sex + ";Age=" + stu.Age);
}
}
原文链接:https://blog.csdn.net/yl2isoft/article/details/13613569
IComparable和IComparer接口的更多相关文章
- [0] 关于IComparable和IComparer接口和Comparer类
关于IComparable和IComparer接口 和 Comparer类 IComparable和ICompareframeworkr接口是.net 中比较对象的标准方式,这两个接口之间的区别如下: ...
- 对象的比较与排序:IComparable和IComparer接口
IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: . ICompar ...
- c# 实现IComparable、IComparer接口、Comparer类的详解
在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...
- 数组自定义排序:IComparable和IComparer接口
首先先说一下IComparable和IComparer的区别,前者必须在实体类中实现,后者可以单独出现在一个排序类中,即此类只包含一个compare方法. Array类使用快速算法对数组中的元素进行排 ...
- C#的 IComparable 和 IComparer接口及ComparableTo方法的 区别(非常重要)
(1)https://blog.csdn.net/ios99999/article/details/77800819 C# IComparable 和 IComparer 区别 (2)https:// ...
- C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序
借豆瓣某博主的话先对这两个接口进行一个解释: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象 IComparer在一个单独的类中实现,可以比较任意两个对象. 如果已经支持 ...
- 实现IComparable、IComparer接口
using System;using System.Collections.Generic; public class MyClass{ public class Employee:IComparab ...
- c# IComparable与IComparer接口
- C# IComparable接口、IComparer接口和CompareTo(Object x)方法、Compare()方法
在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异.比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?重新实现IComparer接口 ...
随机推荐
- WebAPI 使用控制台启动
using System; using System.Web.Http; using System.Web.Http.SelfHost; namespace UAC_OAuth2Center { pu ...
- MongoDB出现The default storage engine 'wiredTiger' is not available之问题解决
问题描述:低版本MongoDB存在该问题(版本为3.x),高版本则无该问题. 参考解决问题链接:MongoDB学习—(1)安装时出现The default storage engine ‘wiredT ...
- Mysql系列(五)—— 分页查询及问题优化
一.用法 在Mysql中分页查询使用关键字limit.limit的语法如下: SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15 limit关键字带有 ...
- winfrom数据导出
/// <summary> /// 数据导出 /// </summary> /// <param name="dataGridView">< ...
- python 学习之 基础篇三 流程控制
前言: 一. python中有严格的格式缩进,因为其在语法中摒弃了“{}”来包含代码块,使用严格的缩进来体现代码层次所以在编写代码的时候项目组要严格的统一器缩进语法,一个tab按键设置为四个空格来缩进 ...
- 基于vue+springboot+docker网站搭建【六】安装中间件
安装中间件 去另外一台2核4G的机器先安装docker,然后安装后台项目使用的中间件 一.mysql 下载镜像:docker pull mysql:5.7 启动镜像实例:docker run -p 3 ...
- php 获取文件下的所有文件。php 获取文件下的所有子文件。php 递归获取文件下的所有文件。封装好的方法
//php 获取文件下的所有文件.php 获取文件下的所有子文件.php 递归获取文件下的所有文件.直接上封装好的php代码 <?php //文件路径 $dir = dirname(__FILE ...
- 设计模式之(十一)代理模式(Proxy)
软件开发行业有一个观点:任务问题都可以添加一个中间层来解决.代理模式也是这个思想下的产物. 首先看下代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.就是把类委托给另外一个类,用这个类来控 ...
- C# DataTable 转实体对象
DataTable 转实体对象 /// <summary> /// DataTable通过反射获取单个对象 /// </summary> public static T ToS ...
- iOS应用开发应遵循的10条设计原则
转自:http://mobile.51cto.com/design-309719.htm 1.操控便捷 iOS应用的控制设计应该具有圆润的轮廓和程式化的梯度,操作便捷. 2.结构清晰.导航方便 充分利 ...