java icomparer_.NET框架中的IComparable、IComparable、IComparer、IEqualityComparer | 学步园

定义如下:

public interface IComparable

{

int CompareTo(object obj);

}

public interface IComparer

{

int Compare(T x, T y);

}

public interface IComparable

{

int CompareTo(T other);

}

public interface IEqualityComparer

{

bool Equals(T x, T y);

int GetHashCode(T obj);

}

对于特定类型实现IComparer接口,这样当你在实现排序

现在准备一个雇员类,内含三个成员(年龄、姓名、所在部门),根据年龄大小来判断大小,年龄大的雇员大于年龄小的雇员。代码如下:

public class Employee : IComparable

{

public int Age

{

get;

set;

}

public string Name

{

get;

set;

}

public string Department

{

get;

set;

}

public Employee(int age,string name,string department)

{

this.Age = age;

this.Name = name;

this.Department = department;

}

#region IComparable Members

public int CompareTo(Employee other)

{

if (this.Age < other.Age) return -1;

if (this.Age == other.Age) return 0;

return 1;

}

#endregion

}

static void Main(string[] args)

{

Employee anders = new Employee(35, "Anders Wang", "Developer Division");

Employee jeffrey = new Employee(28, "Jeffrey Chen", "Developer Division");

Console.WriteLine(anders.CompareTo(jeffrey)); // output 1

Console.ReadKey();

}

从Employee的CompareTo看出,由于anders的Age>jeffrey的Age,所以anders.CompareTo(jeffrey)返回1,表明实例anders大于实例jeffrey。

也可以通过实现接口IComparer,实现比较的功能。代码如下:

class EmployeeComparer:IComparer

{

#region IComparer Members

public int Compare(Employee x, Employee y)

{

if (x.Age < y.Age) return -1;

if (x.Age == y.Age) return 0;

return 1;

}

#endregion

}

}

static void Main(string[] args)

{

Employee anders = new Employee(35, "Anders Wang", "Developer Division");

Employee jeffrey = new Employee(28, "Jeffrey Chen", "Developer Division");

Console.WriteLine(new EmployeeComparer().Compare(anders, jeffrey));//output 1

Console.ReadKey();

}

以上代码也同样实现了比较功能。

要判断两个对象是否相等?我们可以通过实现IEqualityComparer接口或者通过调用基类object的Equals方法。但是在大部分情况下,调用基类object的Equals方法需要进行强制转换,含有类型不安全的问题。下面我们通过EmployeeEqualityComparer来实现IEqualityComparer。代码如下:

public class EmployeeEqualityComparer:IEqualityComparer

{

#region IEqualityComparer Members

public bool Equals(Employee x, Employee y)

{

if (x.Age == y.Age && x.Name == y.Name && x.Department == y.Department)

{

return true;

}

return false;

}

public int GetHashCode(Employee obj)

{

//由于是根据Age,Name,Department来进行判等的,

//所以哈希值的求取过程也要进行一定的修改,

//确保相等对象的哈希值也是相等的。

return obj.GetHashCode();

}

#endregion

}

static void Main(string[] args)

{

Employee anders = new Employee(35, "Anders Wang", "Developer Division");

Employee jeffrey = new Employee(28, "Jeffrey Chen", "Developer Division");

Employee steve = new Employee(35, "Anders Wang", "Developer Division");

Console.WriteLine(new EmployeeEqualityComparer().Equals(anders, jeffrey)); //output false

Console.WriteLine(new EmployeeEqualityComparer().Equals(anders, steve)); //output true

Console.ReadKey();

}

以上代码通过实现IEqualityComparer接口说明了如何判断两个对象相等。

.NET框架提供了IComparable、IComparable、IComparer、IEqualityComparer,这几个接口对于实现排序算法有着直接的作用,在泛型的帮助下,可以编写出通用的排序算法,只需要你根据特定的类型实现以上几个接口中的方法。正是因为接口,使得大家都有了规约,进而使得通用的排序算法实现变得可能。另外在处理和集合相关的类型时,比如字典,哈希表等数据结构时,当你因为具体的语义覆盖了键类型的Equals方法后,务必必也要覆盖GetHashCode方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值