C#中IComparable和IComparer的区别是什么-创新互联

C#中IComparable和IComparer的区别是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

坚守“ 做人真诚 · 做事靠谱 · 口碑至上 · 高效敬业 ”的价值观,专业网站建设服务10余年为成都成都雨棚定制小微创业公司专业提供成都定制网站营销网站建设商城网站建设手机网站建设小程序网站建设网站改版,从内容策划、视觉设计、底层架构、网页布局、功能开发迭代于一体的高端网站建设服务。

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);          }  }

关于C#中IComparable和IComparer的区别是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


当前名称:C#中IComparable和IComparer的区别是什么-创新互联
网站链接:http://myzitong.com/article/eisss.html