前言
arraylist里面有一个方法:
public virtual void sort(icomparer comparer); 使用指定的比较器对整个 system.collections.arraylist 中的元素进行排序。 comparer:比较元素时要使用的 system.collections.icomparer 实现。
啥玩意啊?
1.comparer类简单介绍
想弄清楚这个,我们先来看看这么一个类。
在system.collections名称空间中,有这么一个类:comparer。顾名思义,他可以实现对简单类型的比较,什么意思呢?来看如下代码:
int a=1,b=2;
正常情况下,我们要怎样比较他们的大小?if,运算符,……?这当然可以,不过comparer已经给我们提供了一个函数,可以直接使用:(需要using system.collections;)
console.writeline(comparer.default.compare(a,b));
因为a<b,所以控制台会输出-1。(这个函数总是返回-1,0,1三个值。)
这里通过comparer里的静态属性default获得comparer的实例调用了comparer里的非静态函数compare。
(还可以比较根据字母比较两个string类型,这里就省略介绍了)
2.自定义比较器,icomparable,icomparer接口
当然,这个类不仅仅只是用来比较两个数的大小的。有时候我们想直接比较两个对象,但是引用里面的属性或许比较麻烦。尤其是参考要素过多,不好直接比较的时候,怎样才能更高效地比较两个对象呢?这时候,我们就需要自定义比较器了。
首先来介绍icomparable接口。这个接口里只有一个方法compareto()。让你的类实现这个接口的compareto方法,就可以直接调用这个方法和另一个对象比较。下面是例子:
public class classtest : icomparable { public int inttest; public int compareto(object obj) { return inttest-((classtest)obj).inttest; //这里的代码可以按需要自己编写,这里只是一个简单的示例 } }
然后就可以直接使用啦:
classtest a = new classtest(){inttest=1}; classtest b = new classtest(){inttest=2}; console.writeline(a.compareto(b));//输出-1
comparer类已经为我们提供了icomparer的默认实现,但我们仍然可以自定义它。新建一个类:(记得using system.collections;)
public class classtestcomparer : icomparer { public static icomparer default = new classtestcomparer(); //这里必须使用这样的定义,将对象转化为icomparer类型有很大用处,下面会介绍 public int compare(object a,object b) { return ((classtest)a).inttest - ((classtest)b).inttest; //同样这里使用最简单的示例,但是你可以大放异彩 } }
注意,如果用于比较的类和设定的类不一样,就会出现错误。
使用示例:
classtest a = new classtest(){inttest=1}; classtest b = new classtest(){inttest=2}; console.writeline(classtestcomparer.default.compare(a,b)); //结果是-1
可以发现,这两个接口的不同之处在于:icomparable在要比较的对象的类中实现,可以比较该对象和另一个对象。icomparer在一个单独的类中实现,可以比较任意两个对象(关键是你的设置)。
3.对集合排序
当然,这两个接口还有更强大的用处。我们可以使用这两个接口对集合进行排序。还记得前言里的sort()方法吗?接下来就以arraylist为例,介绍如何使用。
arraylist classtests = new arraylist(); classtest a = new classtest(){inttest=1}; classtest b = new classtest(){inttest=2}; classtest c = new classtest(){inttest=3}; classtests.add(a); classtests.add(b); classtests.add(c); classtests.sort(); //使用无参的sort,将调用类中的compareto()方法,因为classtest实现了这个方法,所以是可以调用的。如果没有实现,编译器会报错。 classtests.sort(classtestcomparer.default); //这将使用compare()方法对集合中的元素排序。classtestcomparer类实现了这个方法,并且提供了一个icomparer类型的属性。
需要注意的是:
- 两个接口提供的方法返回值都是int类型的,负数代表小于,0代表等于,正数代表大于。所以对数字之外的自定义比较器,需要人工设定什么是“大”,什么是“小”。所以上文示例中两个数直接相减,就可以比较大小。
- 排序完之后,按照返回的int值,集合是由小到大排列的。
- 使用无参sort()时,集合中至少要有一个类实现了icomparable,否则会报错。
- 一般来说,都是对同一个类进行比较。不过,也可以实现对不同类比较的代码,这就看具体需要了。
到此这篇关于详解c# icomparable和icomparer接口和自定义比较器的文章就介绍到这了,更多相关c# icomparable icomparer内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论