重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
C#中IComparable和IComparer的区别是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
10年的上思网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整上思建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“上思网站设计”,“上思网站推广”以来,每个客户项目都认真落实执行。
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
IComparer
class StudentComparer : IComparer
关于C#中IComparable和IComparer的区别是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。