博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象的比较与排序:IComparable和IComparer接口
阅读量:4610 次
发布时间:2019-06-09

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

IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下:

1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象。

2. IComparer 在一个单独的类中实现,可以比较任意两个对象。

 

先看 IComparable  这个接口方法是 int CompareTo(object obj); 方法只有一个参数,我们知道比较至少要有两个对象,所以这个方法只能应用在要比较的对象类中,参数传递的对象就可以和 this 做比较。

class obj : IComparable<obj>
{
    
public 
int age = 
10;
    
public 
int CompareTo(obj other)
    {
        
//
return this.age.CompareTo(other.age); 
        
//
下面代码是此方法的具体实现 
        
if (
this.age == other.age)
        {
            
return 
0;
        }
        
else 
if (
this.age > other.age)
        {
            
return 
1;
        }
        
else
        {
            
return -
1;
        }
    }
}
static 
void Main(
string[] args)
{
    obj a = 
new obj();
    obj b = 
new obj();
    a.CompareTo(b); 
//
 0
    a.age = 
20;
    a.CompareTo(b); 
//
 1
    a.age = 
5;
    a.CompareTo(b); 
//
 -1
}

    由此可见,接口IComparable主要是实现类对象间的比较规则。

 

再看IComparer 这个接口提供一个需要两个参数的方法,这个参数也再做比较运算,但是比较主要是为了为对象做排序而非为给类增加比较运算。

class obj
{
    
public 
int age = 
10;
}
class objcomp : IComparer<obj>
{
    
public 
int Compare(obj x, obj y)
    {
        
//
return x.age.CompareTo(y.age); 
        
//
下面代码是此方法的具体实现 
        
if (x.age == y.age)
        {
            
return 
0;
        }
        
else 
if (x.age > y.age)
        {
            
return 
1;
        }
        
else
        {
            
return -
1;
        }
    }
}
static 
void Main(
string[] args)
{
    List<obj> list = 
new List<obj>();
    list.Add(
new obj() { age = 
50 });
    list.Add(
new obj() { age = 
20 });
    list.Add(
new obj() { age = 
40 });
    
    
//
 列表中元素原始顺序(按照age)50,20,40
    list.Sort(
new objcomp()); 
//
 public void Sort(IComparer<T> comparer);调用了Sort方法的重载版本
    
    
//
 经过排序列表中元素顺序(按照age)20,40,50
}

    当然了,如果你想更改排序规则按照降序排列可以交换 objcomp 中方法参数的 age 值大于和小于时的返回值。

转载于:https://www.cnblogs.com/kingcat/archive/2012/07/09/2583198.html

你可能感兴趣的文章
ssm项目中 数据库和资源的备份
查看>>
HDU5950【矩阵快速幂】
查看>>
在线C++编译器
查看>>
C#中各种serialization的比较
查看>>
P2617 Dynamic Rankings
查看>>
工作学习常识1
查看>>
Eclipse插件项目中读取文件
查看>>
jquery定义链接跳转的高亮显示
查看>>
CheckListBox怎样得到多选值?
查看>>
三道题(关于虚表指针位置/合成64位ID/利用栈实现四则运算)
查看>>
Vijos P1243 生产产品 (单调队列优化DP)
查看>>
mysql 数据表操作 目录
查看>>
iOS常用第三方库 -转
查看>>
Android布局学习
查看>>
jQuery中事件绑定与解绑
查看>>
js原生Ajax的封装与使用
查看>>
周总结6
查看>>
PostgreSQL 务实应用(二/5)插入冲突
查看>>
一种公众号回复关键词机制
查看>>
java多线程入门学习(一)
查看>>