C#中,自定义类型,支持比较和排序,需要实现IComparable接口。IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表示当前对象大于被比较对象,0表示两者相等,-1表示当前对象小于被比较对象。

  1. public int CompareTo(object o) {}

若想以更加灵活的方式对自定义类进行比较,可以声明一个继承自IComparer接口的比较器,实现接口方法Comprae(),接收2个object类型参数作为比较对象,返回整型值:1表示前者大于后者,0表示两者相等,-1表示前者小于后者。

  1. public int Compare(object x, object y) {}

IComparable是“可比较的”意思,自定义类实现该接口,就具有可比较的功能;IComparer是“比较器”的意思,实现该接口的类就是一个比较器,可以将比较器“注入”类中,使类具有比较和排序的功能。

IComparable接口示例代码

定义学生类,该类实现IComparable接口的CompareTo方法,该方法对Age 进行大小比较。

  1. public class Student : IComparable
  2. {
  3. public string Name { get; set; }
  4. public string Sex { get; set; }
  5. public int Age { get; set; }
  6. public int CompareTo(object obj)
  7. {
  8. Student stu = obj as Student;
  9. if (Age > stu.Age)
  10. {
  11. return ;
  12. }
  13. else if (Age == stu.Age)
  14. {
  15. return ;
  16. }
  17. else
  18. {
  19. return -;
  20. }
  21. }
  22. }

调用List<T>.Sort方法实现stuList按照学生的年龄来排序。

  1. static void Main(string[] args)
  2. {
  3. List<Student> stuList = new List<Student>();
  4. stuList.Add(new Student() { Name = "tiana0", Sex = "Man", Age = });
  5. stuList.Add(new Student() { Name = "tiana1", Sex = "Woman", Age = });
  6. stuList.Add(new Student() { Name = "tiana2", Sex = "Woman", Age = });
  7. stuList.Add(new Student() { Name = "tiana3", Sex = "Man", Age = });
  8. stuList.Add(new Student() { Name = "tiana4", Sex = "Woman", Age = });
  9. stuList.Sort();
  10. foreach (Student stu in stuList)
  11. {
  12. Console.WriteLine("Name=" + stu.Name + ";Sex=" + stu.Sex + ";Age=" + stu.Age);
  13. }
  14. }

IComparer接口示例代码

定义学生类。

  1. public class Student
  2. {
  3. public string Name { get; set; }
  4. public string Sex { get; set; }
  5. public int Age { get; set; }
  6. }

自定义比较器AgeComparer,实现接口IComparer<Student>,对学生年龄进行比较。

  1. public class AgeComparer : IComparer<Student>
  2. {
  3. public int Compare(Student x, Student y)
  4. {
  5. return x.Age.CompareTo(y.Age);
  6. }
  7. }

自定义比较器NameComparer,实现接口IComparer<Student>,对学生姓名进行比较。

  1. public class NameComparer : IComparer<Student>
  2. {
  3. public int Compare(Student x, Student y)
  4. {
  5. return x.Name.CompareTo(y.Name);
  6. }
  7. }

调用List<T>.Sort方法实现stuList按照学生的年龄与姓名排序。

  1. static void Main(string[] args)
  2. {
  3. List<Student> stuList = new List<Student>();
  4. stuList.Add(new Student() { Name = "aki", Sex = "Man", Age = });
  5. stuList.Add(new Student() { Name = "cki", Sex = "Woman", Age = });
  6. stuList.Add(new Student() { Name = "dki", Sex = "Woman", Age = });
  7. stuList.Add(new Student() { Name = "bki", Sex = "Man", Age = });
  8. stuList.Add(new Student() { Name = "fki", Sex = "Woman", Age = });
  9. stuList.Sort(new AgeComparer());
  10. Console.WriteLine("按照年龄排序:");
  11. foreach (Student stu in stuList)
  12. {
  13. Console.WriteLine("Name=" + stu.Name + ";Sex=" + stu.Sex + ";Age=" + stu.Age);
  14. }
  15. stuList.Sort(new NameComparer());
  16. Console.WriteLine();
  17. Console.WriteLine("按照名称排序:");
  18. foreach (Student stu in stuList)
  19. {
  20. Console.WriteLine("Name=" + stu.Name + ";Sex=" + stu.Sex + ";Age=" + stu.Age);
  21. }
  22. }

原文链接:https://blog.csdn.net/yl2isoft/article/details/13613569

IComparable和IComparer接口的更多相关文章

  1. [0] 关于IComparable和IComparer接口和Comparer类

    关于IComparable和IComparer接口 和 Comparer类 IComparable和ICompareframeworkr接口是.net 中比较对象的标准方式,这两个接口之间的区别如下: ...

  2. 对象的比较与排序:IComparable和IComparer接口

    IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: . ICompar ...

  3. c# 实现IComparable、IComparer接口、Comparer类的详解

    在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICom ...

  4. 数组自定义排序:IComparable和IComparer接口

    首先先说一下IComparable和IComparer的区别,前者必须在实体类中实现,后者可以单独出现在一个排序类中,即此类只包含一个compare方法. Array类使用快速算法对数组中的元素进行排 ...

  5. C#的 IComparable 和 IComparer接口及ComparableTo方法的 区别(非常重要)

    (1)https://blog.csdn.net/ios99999/article/details/77800819 C# IComparable 和 IComparer 区别 (2)https:// ...

  6. C#中的IComparable 和 IComparer 接口,实现列表中的对象比较和排序

    借豆瓣某博主的话先对这两个接口进行一个解释: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象 IComparer在一个单独的类中实现,可以比较任意两个对象. 如果已经支持 ...

  7. 实现IComparable、IComparer接口

    using System;using System.Collections.Generic; public class MyClass{ public class Employee:IComparab ...

  8. c# IComparable与IComparer接口

  9. C# IComparable接口、IComparer接口和CompareTo(Object x)方法、Compare()方法

    在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异.比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?重新实现IComparer接口 ...

随机推荐

  1. x58平台 服务器电源配置 tdp

    我的机器配置: 处理器:    Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz *2主板:    TYAN Tyan Tank GT20-B7002LN ...

  2. 初探Java设计模式4:一文带你掌握JDK中的设计模式

    转自https://javadoop.com/post/design-pattern 行为型模式 策略模式 观察者模式 责任链模式 模板方法模式 状态模式 行为型模式总结 本系列文章将整理到我在Git ...

  3. prometheus exporter简介

    一.服务分类 在线服务:请求的客户端和发起者需要立即响应(高并发.低延迟:并发数.接口响应时间.错误数.延迟时间),面对突发流量能进行资源的自动伸缩 离线服务:请求发送到服务端但不要求立即获取结果(监 ...

  4. laravel学习:主从读写分离配置的实现

    本篇文章给大家带来的内容是关于laravel学习:主从读写分离配置的实现,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在DB的连接工厂中找到以下代码.../vendor/larav ...

  5. jQuery学习路线&review

    学习途径:http://www.w3school.com.cn/jquery/index.asp 路线图 转载自:https://www.cnblogs.com/lanren2017/p/723720 ...

  6. Hbase Filter之PrefixFilter

    PrefixFilter PrefixFilter是将rowkey前缀为指定字符串的数据全部过滤出来并返回给用户.例如: Scan scan = new Scan(); scan.setFilter( ...

  7. IDEA rider 管道模式 经典模式(2)

    1.这里设置为Classic,并打开applicationhost.config将对应应用的 Clr4IntegratedAppPool全部替换为 Clr4ClassicAppPool 2.Confi ...

  8. springboot指定注解扫描范围

    springboot注解扫描范围是由@ComponentScan指定的;默认情况下为启动程序所在目录及其子包; 如果需要指定扫描路径,在启动程序中添加修改 @ComponentScan(basePac ...

  9. IntelliJ idea 撤回(已经commit未push的)操作

    VSC  => Git => reset head => 退回到上次commit => 退回到第2次提交之前 => 退回到指定commit版本

  10. Scala中sortBy和Spark中sortBy区别

    Scala中sortBy是以方法的形式存在的,并且是作用在Array或List集合排序上,并且这个sortBy默认只能升序,除非实现隐式转换或调用reverse方法才能实现降序,Spark中sortB ...