it编程 > 编程语言 > Asp.net

详解C# IComparable和IComparer接口和自定义比较器

5人参与 2025-07-27 Asp.net

前言

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类型的属性。

需要注意的是:

到此这篇关于详解c# icomparable和icomparer接口和自定义比较器的文章就介绍到这了,更多相关c# icomparable icomparer内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

C# $字符串插值的使用

07-27

C# List.Sort排序(默认排序和自定义排序)

07-27

C#中的Converter的具体应用

07-27

C#中lock关键字的使用小结

07-27

C#洗牌算法的具体实现

07-27

c#中生成随机数的五种方法

07-27

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论