博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
比较和排序(IComparable和IComparer以及它们的泛型实现)
阅读量:6336 次
发布时间:2019-06-22

本文共 4069 字,大约阅读时间需要 13 分钟。

本文摘要:

1:比较和排序的概念;

2:IComparable和IComparer;

3:IComparable和IComparer的泛型实现IComparable<T>和IComparer<T>;

 

1:比较和排序的概念

    比较:两个实体类之间按>,=,<进行比较。

    排序:在集合类中,对集合类中的实体进行排序。排序基于的算法基于实体类提供的比较函数。

    基本型别都提供了默认的比较算法,如string提供了按字母进行比较,int提供了按整数大小进行比较。

 

2:IComparable和IComparer

    当我们创建了自己的实体类,如Student,默认想要对其按照年龄进行排序,则需要为实体类实现IComparable接口。

class Student:IComparable    {        public string Name { get; set; }        public int Age { get; set; }        #region IComparable Members        public int CompareTo(object obj)        {            Student student = obj as Student;            if (Age > student.Age)            {                return 1;            }            else if (Age == student.Age)            {                return 0;            }            else            {                return -1;            }            //return Age.CompareTo(student.Age);        }        #endregion    }
PS:注意上面代码中CompareTo方法有一条注释的代码,其实本函数完全可以使用该注释代码代替,因为利用了整形的默认比较方法。此处未使用本注释代码,是为了更好的说明比较器的工作原理。
接下来写一个测试用例:
public Form1()        {            InitializeComponent();            studentList = new ArrayList();            studentList.Add(new Student() { Age = 1, Name = "a1" });            studentList.Add(new Student() { Age = 5, Name = "g1" });            studentList.Add(new Student() { Age = 4, Name = "b1" });            studentList.Add(new Student() { Age = 2, Name = "f1" });        }        ArrayList studentList;        private void button1_Click(object sender, EventArgs e)        {            studentList.Sort();            foreach (Student item in studentList)            {                                this.textBox1.Text += item.Name + "----" +item.Age.ToString() + "\r\n"  ;            }        }

      运行结果:

a1----1

f1----2
b1----4
g1----5

      OK,疑问来了。如果不想使用年龄作为比较器了,那怎么办。这个时候IComparer的作用就来了,可使用IComparer来实现一个自定义的比较器。如下:

class SortName: IComparer    {        #region IComparer Members        public int Compare(object x, object y)        {            Student s1 = x as Student;            Student s2 = y as Student;            return s1.Name.CompareTo(s2.Name);        }        #endregion    }

      这个时候,我们在排序的使用为Sort方法提供此比较器:

      studentList.Sort(new SortName());

      运行的结果是:

a1----1

b1----4
f1----2
g1----5

            

3:IComparable和IComparer的泛型实现IComparable<T>和IComparer<T>

      如果我们稍有经验,我们就会发现上面的代码我们使用了一个已经不建议使用的集合类ArrayList。当泛型出来后,所有非泛型集合类已经建议不尽量使用了。至于原因,从上面的代码中我们也可以看出一点端倪。

      注意查看这个Compare函数,如: 

public int Compare(object x, object y)        {            Student s1 = x as Student;            Student s2 = y as Student;            return s1.Name.CompareTo(s2.Name);        }

      我们发现这个函数进行了装箱和拆箱。而这是会影响性能的。如果我们的集合中有成千上万个复杂的实体对象,则在排序的时候所耗费掉的性能就是客观的。而泛型的出现,就可以避免掉拆箱和装箱。

      故上文代码中的ArrayList,应该换成List<T>,对应的,我们就该实现IComparable<T>和IComparer<T>。最终的代码应该像:

public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            studentList = new List
(); studentList.Add(new Student() { Age = 1, Name = "a1" }); studentList.Add(new Student() { Age = 5, Name = "g1" }); studentList.Add(new Student() { Age = 4, Name = "b1" }); studentList.Add(new Student() { Age = 2, Name = "f1" }); } List
studentList; private void button1_Click(object sender, EventArgs e) { studentList.Sort(new SortName()); foreach (Student item in studentList) { this.textBox1.Text += item.Name + "----" +item.Age.ToString() + "\r\n" ; } } } class Student:IComparable
{ public string Name { get; set; } public int Age { get; set; } #region IComparable
Members public int CompareTo(Student other) { return Age.CompareTo(other.Age); } #endregion } class SortName: IComparer
{ #region IComparer
Members public int Compare(Student x, Student y) { return x.Name.CompareTo(y.Name); } #endregion }

转载于:https://www.cnblogs.com/objectboy/p/4635227.html

你可能感兴趣的文章
最大熵模型(二)朗格朗日函数
查看>>
深入了解setInterval方法
查看>>
html img Src base64 图片显示
查看>>
[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction...
查看>>
FFMPEG中关于ts流的时长估计的实现(转)
查看>>
Java第三次作业
查看>>
【HDOJ 3652】B-number
查看>>
android代码混淆笔记
查看>>
Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction 并查集
查看>>
BMP文件的读取与显示
查看>>
Flash文字效果
查看>>
各种排序算法总结篇(高速/堆/希尔/归并)
查看>>
使用c#訪问Access数据库时,提示找不到可安装的 ISAM
查看>>
Highcharts X轴纵向显示
查看>>
windows 注册表讲解
查看>>
【算法】论平衡二叉树(AVL)的正确种植方法
查看>>
基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍
查看>>
react 从零开始搭建开发环境
查看>>
scala recursive value x$5 needs type
查看>>
ps -ef |grep 输出的具体含义
查看>>