用实例来理解IComparable和IComparer

接口的功能 我想大家都是知道的,书上已经讲的天花烂醉了

但是烦人的是大部分初学者包括我死活看不懂他们说的是什么意思,昨晚在C#高级编程中看了看总算 理解 了 一点点的小作用,在此记录下以便以后拾遗

 

主要是通过Array的Sort方法来理解的 Sort方法要 通过对象去继承IComparable接口来实现排序(当然也有其它办法),我想入门这可能就是对这句话有点不理解,在下面会有注释

 

复制代码
  
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
/// <summary>
/// 设置FirstName和LastName两个属性为排序条件,对person安姓名进行排序
/// </summary>
public class Person : IComparable
{
private string _firstName;
/// <summary>
/// 第一个字母
/// </summary>
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
private string _lastName;
/// <summary>
/// 第二个字母
/// </summary>
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
public Person( string firstName, string lastName)
{
_firstName
= firstName;
_lastName
= lastName;
}
// 理解接口的作用,在这里 继承了IComparable接口,使得Person类必须实现这个接口(实现接口 就是 实现CompareTo方法,Array.Sort排序的时候 只认CompareTo方法,如果没有继承接口,就算有这个方法 也是会抛出异常)
// 实现接口后在Array中 能通过这个被实现的接口方法(规定好了是CompareTo方法),根据返回值 而去处理sort方法(在Array.Sort 中已经规定了ComapreTo方法 返回值代表的意义),这样在Person中就可以 由用户
// 自己在CompareTo方法中随便的去定义 方法的实现方式,只要返回值满足 规定 即可,真是 妙极了(0相等1大于-1小于)
public int CompareTo( object obj)
{
Person other
= obj as Person;
// 先比较LastName,如果是0则继续比较FirstName
int result = this .LastName.CompareTo(other.LastName);
if (result == 0 )
{
result
= this .FirstName.CompareTo(other.FirstName);
}
return result;
}
public override string ToString()
{
return FirstName + " " + LastName;
}
}


class Program
{
static void Main( string [] args)
{
Person[] persons
= { new Person( " z " , " l " ),
new Person( " w " , " x " ),
new Person( " l " , " s " ),
new Person( " l " , " m " ),
new Person( " a " , " l " )};
Array.Sort(persons);
// 排序
foreach (Person p in persons)
{
Console.WriteLine(p);
}

}
}
}
复制代码

 

 

 上面的情况是 可以对 Person类进行修改的情况下的做法,如果不能修改Person呢,这个时候就要IComparer接口大显身手了

利用了Sort方法的重载,添加一个对IComparer接口的实现的接口即可

 

复制代码
  
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
/// <summary>
/// 设置FirstName和LastName两个属性为排序条件,对person安姓名进行排序
/// </summary>
public class Person // : IComparable
{
private string _firstName;
/// <summary>
/// 第一个字母
/// </summary>
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
private string _lastName;
/// <summary>
/// 第二个字母
/// </summary>
public string LastName
{
get { return _lastName; }
set { _lastName = value; }
}
public Person( string firstName, string lastName)
{
_firstName
= firstName;
_lastName
= lastName;
}
// 理解接口的作用,在这里 继承了IComparable接口,使得Person类必须实现这个接口(实现接口 就是 实现CompareTo方法,Array.Sort排序的时候 只认CompareTo方法,如果没有继承接口,就算有这个方法 也是会抛出异常)
// 实现接口后在Array中 能通过这个被实现的接口方法(规定好了是CompareTo方法),根据返回值 而去处理sort方法(在Array.Sort 中已经规定了ComapreTo方法 返回值代表的意义),这样在Person中就可以 由用户
// 自己在CompareTo方法中随便的去定义 方法的实现方式,只要返回值满足 规定 即可,真是 妙极了(0相等1大于-1小于)
public int CompareTo( object obj)
{
Person other
= obj as Person;
// 先比较LastName,如果是0则继续比较FirstName
int result = this .LastName.CompareTo(other.LastName);
if (result == 0 )
{
result
= this .FirstName.CompareTo(other.FirstName);
}
return result;
}
public override string ToString()
{
return FirstName + " " + LastName;
}
}
/// <summary>
/// 架设Person是不允许我们去修改的,这个时候我们就用IComparer接口,然后Sort根据被实现的Compaer方法去排序
/// </summary>
public class PersonComparer : IComparer
{
/// <summary>
/// 枚举,排序条件
/// </summary>
public enum PersonCompareType
{
/// <summary>
/// 第一个名字
/// </summary>
FirstName,
LastName
}
private PersonCompareType compareType;
public PersonComparer(PersonCompareType compareType)
{
this .compareType = compareType;
}
public int Compare( object x, object y)
{
Person p1
= x as Person;
Person p2
= y as Person;
switch (compareType)
{
case PersonCompareType.FirstName:
return p1.FirstName.CompareTo(p2.FirstName);

case PersonCompareType.LastName:
return p1.LastName.CompareTo(p2.LastName);

default :
throw new ArgumentException( " 必须指定比较类型 " );
}

}
}


class Program
{
static void Main( string [] args)
{
Person[] persons
= { new Person( " z " , " l " ),
new Person( " w " , " x " ),
new Person( " l " , " s " ),
new Person( " l " , " m " ),
new Person( " a " , " l " )};
Array.Sort(persons);
// 排序
foreach (Person p in persons)
{
Console.WriteLine(p);
}
Console.WriteLine(
" ----------------- " );
// 注意这个地方的方法重载
Array.Sort(persons, new PersonComparer(PersonComparer.PersonCompareType.FirstName));
foreach (Person p in persons)
{
Console.WriteLine(p);
}
Console.WriteLine(
" ----------------- " );
Array.Sort(persons,
new PersonComparer(PersonComparer.PersonCompareType.LastName));
foreach (Person p in persons)
{
Console.WriteLine(p);
}

}
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值