C#中IComparable和IComparer的区别是什么
创始人
2024-12-24 01:01:23
0次

IComparable接口

该接口由其值可以排序或排序的类型实现,并提供强类型的比较方法以对泛型集合对象的成员进行排序,例如数字可以大于第二个数字,一个字符串可以在另一个字符串之前以字母顺序出现。他要求实现类型定义的一个方法,CompareTo(T)该方法指示当前实现在排序顺序中的位置是在同一个类型和第二个对象之前、之后还是与其相同。通常,不会直接从开发人员代码中调用方法。相反他由List .Sort()和Add等方法自动调用。

通常,提供Icomparable 实现的类型还IEquatable 实现接口。IEquatable 接口Equals定义方法,该方法确定实现类型的实例的相等性。

CompareTo(T)方法的实现必须Int32返回具有以下三个值之一的,如下表所示。

小于零      此对象在排序顺序中位于CompareTo方法所指定的对象之前。              零      此当前实例在排序顺序中与CompareTo方法参数指定的对象出现在同一位置。              大于零      此当前实例位于排序顺序中由CompareTo方法自变量指定的对象之后。

示例:

class Student : IComparable  {    public string Name { get; set; }    public int Age { get; set; }    public int CompareTo(object obj)    {      if (!(obj is Student))      {        throw new ArgumentException("Compared Object is not of student");      }      Student student = obj as Student;      return Age.CompareTo(student.Age);    }  }

值含义

Ps:我们根据通过Age(int)来进行我们的排序

执行测试

class Program  {    static void Main(string[] args)    {      ArrayList studentList = new ArrayList {        new Student{Name="a",Age=9 },         new Student{Name="a3",Age=7 },         new Student{Name="a1",Age=6 },         new Student{Name="a2",Age=10 },      };      studentList.Sort();      StudentComparable(studentList);      Console.ReadLine();    }    private static void StudentComparable(ArrayList studentList)    {      foreach (Student item in studentList)      {        Console.WriteLine("Name:{0},Age:{1}", item.Name, item.Age);      }    }  }

输出如下

IComparer接口

IComparable 接口的CompareTo方法一次只能对一个字段进行排序,因此无法对不同的属性进行排序。IComparer接口提供了Compare方法,该方法比较两个对象并返回一个值,该值指示一个对象小于,等于或大于另一个对象。实现IComparer接口的类必须提供比较两个对象的Compare方法。例如,您可以创建一个StudentComparer类,该类实现IComparer,并具有一个Compare方法,该方法按Name比较Student对象。然后,您可以将StudentComparer对象传递给Array.Sort方法,它可以使用该对象对Student对象的数组进行排序。

示例

class StudentComparer : IComparer  {    public int Compare(object x, object y)    {      Student x1 = x as Student;      Student y1 = y as Student;      return x1.Name.CompareTo(y1.Name);    }  }

Ps:我们根据Name(string)进行排序

执行测试

class Program  {    static void Main(string[] args)    {      ArrayList studentList = new ArrayList {        new Student{Name="a",Age=9 },         new Student{Name="a3",Age=7 },         new Student{Name="a1",Age=6 },         new Student{Name="a2",Age=10 },      };      studentList.Sort(new StudentComparer());      StudentComparable(studentList);      Console.ReadLine();    }    private static void StudentComparable(ArrayList studentList)    {      foreach (Student item in studentList)      {        Console.WriteLine("Name:{0},Age:{1}", item.Name, item.Age);      }    }  }

输出结果如下

IComparable 和IComparer

上述示例中我们将对象进行了多次的装箱和拆箱,那么此时我们可以将方法改为泛型的,泛型的出现也让我们避免了装箱和拆箱的资源浪费.

最终我们实现的代码片段如下:

IComparable

class Student : IComparable  {    public string Name { get; set; }    public int Age { get; set; }    public int CompareTo([AllowNull] Student other)    {      return Age.CompareTo(other.Age);    }  }

IComparer

class StudentComparer : IComparer  {    public int Compare([AllowNull] Student x, [AllowNull] Student y)    {      return x.Name.CompareTo(y.Name);          }  }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...