A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dongqinglove 中级黑马   /  2014-1-5 20:55  /  1800 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 dongqinglove 于 2014-1-7 09:07 编辑

我想问下IComparable和IComparer接口的区别,在使用中要注意什么

评分

参与人数 1技术分 +2 收起 理由
V_John + 2

查看全部评分

3 个回复

正序浏览
IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口之间的区别如下:
1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象。
2.IComparer 在一个单独的类中实现,可以比较任意两个对象。
一般情况下,我们使用 IComparable 给出类的默认比较代码,使用其他类给出非默认的比较代码。
一、IComparable提供了一个方法int CompareTo(object obj)。这个方法接受一个对象,所以可以实现这个接口
比如:以便把 Person 对象传送给它,
说明这个人是否比当前的人更年老或年轻。实际上,这个方法返回一个int,所以可和下面的代码说明第二个人更年老还是更年轻。
代码如下:
if(person1.CompareTo(person2) == 0)
{
  Console.WriteLine("Same age");
}
else if(person1.CompareTo(person2) > 0 )
{
  Console.WriteLine("person 1 is older");
}
else
{
  Console.WriteLine("person1 is younger");
}

二、IComparer 也提供了一个方法 Compare().这个方法接受两个对象,返回一个整型结果,这与 CompareTo()相同。
对于支持 IComparer的对象,可以使用下面的代码:
代码如下:
if(personComparer.Compare(person1,person2) == 0)
{
  Console.WriteLine("same age");
}
else if(personComparer.Compare(person1,person2) > 0 )
{
  Console.WriteLine("person 1 is older");
}
else
{
  Console.WriteLine("person1 is younger");
}

在这两种情况下,提供给方法的参数是system.object类型。也就是说,可以比较任意类型的两个对象。所以,在返回结果之前,通常需要进行某种类型比较,如果使用了错误的类型,还会抛出异常。实际上,我们是使用泛型接口IComparable<T>,可以省略对象转换。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
非常感谢 我有些理解了 我再找些列子写写
回复 使用道具 举报
1. IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象;
2. IComparer在一个单独的类中实现,可以比较任意两个对象;
3. IComparable 的作用是提供了一种比较两个对象的特定类型的方法;
4. IComparer 的角色是提供附加的比较机制;
5. IComparable是实现一般对象的比较接口,
6. int CompareTo(object obj),它提供来对单个对象进行比较的接口,继承IComparable的类需要自己提供排序比较函数以便对集合对象进行正确序列比较;
7. IComparer<T>也是IComparer接口的泛型版本,该接口为两对象的比较提供来另一种机制。IComparer接口需要实现Compare方法int Compare(object x, object y),该方法返回三个值1, 0, -1分别表示大于,等于,小于。

评分

参与人数 1技术分 +1 收起 理由
V_John + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马