IComparer和IComparable的区别

一:IComparable
//IComparable接口只有一个方法:CompareTo(),这个方法沿用了传统的C函数库里的strcmp函数的实现原则:
//如果当前对象比目标对象小,它的返回值小于0;如果相等就返回0;如果当前对象比目标对象大,返回值就大于0。
//函数原型如下:
public interface IComparable
{
    int CompareTo(object obj);
}

public struct Customer : IComparable
{
    private readonly string _name;
    public Customer( string name )
    {
        _name = name;
    }
    //要检测参数的运行时类型。不正确的代码可以用任何类型做为参数来调用CompareTo方法。
    //还有,正确的参数还必须进行装箱与拆箱后才能提供实际的比较。
    //可以重载CompareTo()方法,让它只对Customer 对象操作:
    public int CompareTo( object right )
    {
        if ( ! ( right is Customer ) )
            throw new ArgumentException( "Argument not a customer", "right" );
        Customer rightCustomer = ( Customer )right;
        return _name.CompareTo( rightCustomer._name );
    }
}
public struct Customer : IComparable
{
    private string _name;
    public Customer( string name )
    {
        _name = name;
    }
    //只能通过强制转化为IComparable 接口后才能访问:
    //Customer c1;
    //Employee e1;
    //if ( ( c1 as IComparable ).CompareTo( e1 ) > 0 )
    //    Console.WriteLine( "Customer one is greater" );
    int IComparable.CompareTo( object right )
    {
        if ( ! ( right is Customer ) )
            throw new ArgumentException( "Argument not a customer", "right");
        Customer rightCustomer = ( Customer )right;
        return CompareTo( rightCustomer );
    }
    //Customer c1;
    //Employee e1;
    //if ( c1.CompareTo( e1 ) > 0 )
    //    Console.WriteLine( "Customer one is greater" );
    public int CompareTo( Customer right )
    {
        return _name.CompareTo( right._name );
    }
    public static bool operator < ( Customer left, Customer right )
    {
        return left.CompareTo( right ) < 0;
    }
    public static bool operator <=( Customer left, Customer right )
    {
        return left.CompareTo( right ) <= 0;
    }
    public static bool operator >( Customer left, Customer right )
    {
        return left.CompareTo( right ) > 0;
    }
    public static bool operator >=( Customer left, Customer right )
    {
        return left.CompareTo( right ) >= 0;
    }
}

二:IComparer
//角色的 IComparer 旨在提供其他比较机制。 例如, 您可能希望提供排序是按几个字段或属性, 类升序和降序对同一字段, 或两者 
public interface IComparer
{
    int Compare(object x, object y);
}
//Array.Sort(arrayOfCutstomers,Customer._revComp);
public struct Customer : IComparable
{
    private string _name;
    private double _revenue;

    private static RevenueComparer _revComp = null;
    public static IComparer RevenueCompare
    {
        get
        {
            if ( _revComp == null )
                _revComp = new RevenueComparer();
            return _revComp;
        }
    }

    private class RevenueComparer : IComparer
    {
        int IComparer.Compare( object left, object right )
        {
            if ( ! ( left is Customer ) )
                throw new ArgumentException("Argument is not a Customer", "left");
            if (! ( right is Customer) )
                throw new ArgumentException("Argument is not a Customer", "right");
            Customer leftCustomer = ( Customer ) left;
            Customer rightCustomer = ( Customer ) right;
            return leftCustomer._revenue.CompareTo(rightCustomer._revenue);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值