C#中IComparer和IComparable接口

本文介绍使用两个接口,IComparer和IComparable。在相同的环境下面讨论这两个接口。其一:这些常用在一起,虽然接口很相似,但是两者却提供不同的用途。其二:如果有数组类型 (如 字符串 或 整数 ) 已经支持 IComparer , 则不提供任何显式引用到 IComparer 可排序该数组。 数组的元素此时, 都转换为 IComparer ( Comparer.Default ) 的默认实现对。 但是, 如果要提供排序或比较功能对于您自定义对象, 必须实现任一或两个这些接口。

ICmparable

class Person:IComparable
    {
        public int ID;
        public string Rank;

        //构造函数,初始化时就会分析

        public Person(int id,string rank)
        {
            this.ID = id;
            this.Rank = rank;
        }

        public int CompareTo(object obj)
        {
            Person person = (Person)obj;
            return this.ID.CompareTo(person.ID);
        }

    }

class Program
    {     
        static void Main(string[] args)
        {
            ArrayList list = new ArrayList();
            list.Add(new Person(6,"排长"));
            list.Add(new Person(3,"团长"));
            list.Add(new Person(4,"司令"));
            list.Add(new Person(5,"旅长"));
            list.Add(new Person(7,"连长"));
            list.Add(new Person(1,"军长"));
            list.Add(new Person(2,"营长"));
            list.Add(new Person(8,"班长"));
            list.Sort();

            Console.WriteLine("After sorting!");

            foreach(Person person in list)
            {
                Console.WriteLine("ID:"+person.ID.ToString()+",Rank:"+person.Rank);
            }
        }
    }

输出的结果为:

After sorting!
ID:1,Rank:军长
ID:2,Rank:营长
ID:3,Rank:团长
ID:4,Rank:司令
ID:5,Rank:旅长
ID:6,Rank:排长
ID:7,Rank:连长
ID:8,Rank:班长

IComparer

角色的 IComparer 旨在提供其他比较机制。 例如, 您可能希望提供排序是按几个字段或属性, 类升序和降序对同一字段, 或两者

使用 IComparer 是一个两步过程。 首先, 声明类实现 IComparer , 并然后实现 Compare 方法:

private class sortYearAscendingHelper : IComparer

{

int IComparer.Compare(object a, object b)

{

car c1=(car)a;

car c2=(car)b;

if (c1.year > c2.year)

return 1;

if (c1.year < c2.year)

return -1;

else

return 0;

}

}

注意 IComparer.Compare 方法要求第三级比较。 1, 0 或 - 1 是返回根据一个值是大于、, 等于或小于另一个。 通过此方法中切换逻辑运算符更改排序次序 (升序或降序)。

第二步是要返回您 IComparer 对象的一个实例方法声明:

public static IComparer sortYearAscending()

{

return (IComparer) new sortYearAscendingHelper();

}

 

使用 IComparer 不仅限于数组。 它被接受多种不同集合和控件类中以参数形式。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值