调用LIST的Sort的时候会调用IComparer的默认实现,quicksort会调用每个元素的CompareTo的IComparable实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ComparerTest
{
class Employee : IComparable<Employee>
{
private int empID;
private int yearOfSvc = 1; public Employee(int empID)
{
this.empID = empID;
} public Employee(int empID, int yearOfSvc)
{
this.empID = empID;
this.yearOfSvc = yearOfSvc;
} public override string ToString()
{
return "ID: " + empID.ToString()
+ " yearOfSvc: " + yearOfSvc.ToString();
} public bool Equals(Employee other)
{
if (this.empID == other.empID)
{
return true;
}
else
{
return false;
}
} //获取Comparer对象的静态方法
public static EmployeeComparer GetComparer()
{
return new Employee.EmployeeComparer();
}
//比较委托回Employee
//Employee使用整形的默认
//CompareTo方法
public int CompareTo(Employee rhs)
{
return this.empID.CompareTo(rhs.empID);
} //自定义Comparer要调用的特殊表现
public int CompareTo(Employee rhs,
Employee.EmployeeComparer.ComparisonType whichComparision)
{
switch (whichComparision)
{
case Employee.EmployeeComparer.ComparisonType.EmpID:
return this.empID.CompareTo(rhs.empID);
case Employee.EmployeeComparer.ComparisonType.Yrs:
return this.yearOfSvc.CompareTo(rhs.yearOfSvc);
}
return 0;
} //实现IComparer的内嵌类
public class EmployeeComparer : IComparer<Employee>
{
private Employee.EmployeeComparer.ComparisonType whichComparision; public enum ComparisonType
{
EmpID,
Yrs
}; public bool Equals(Employee lhs, Employee rhs)
{
return this.Compare(lhs, rhs) == 0;
}
//让Empolyee对象自己比较
public int Compare(Employee lhs, Employee rhs)
{
return lhs.CompareTo(rhs, WhichComparison);
} public int GetHashCode(Employee e)
{
return e.GetHashCode();
} public Employee.EmployeeComparer.ComparisonType WhichComparison
{
set
{
whichComparision = value;
}
get
{
return whichComparision;
} }
}
}
class Program
{
static void Main(string[] args)
{
List<Employee> empArray = new List<Employee>(); Random ra = new Random(); for (int i = 0; i < 5; i++)
{
empArray.Add(new Employee(ra.Next(10)+100,ra.Next(20)));
} for (int i = 0; i < empArray.Count; i++)
{
Console.Write("\n{0}",empArray[i].ToString());
}
Console.WriteLine();
Console.WriteLine();
Employee.EmployeeComparer c = Employee.GetComparer(); c.WhichComparison = Employee.EmployeeComparer.ComparisonType.EmpID; empArray.Sort(c); for (int i = 0; i < empArray.Count; i++)
{
Console.Write("\n{0}", empArray[i].ToString());
}
Console.WriteLine();
Console.WriteLine();
Employee.EmployeeComparer c2 = Employee.GetComparer(); c.WhichComparison = Employee.EmployeeComparer.ComparisonType.Yrs; empArray.Sort(c2); for (int i = 0; i < empArray.Count; i++)
{
Console.Write("\n{0}", empArray[i].ToString());
}
Console.ReadLine();
}
}
}

C#_IComparer实例 - 实现ID或者yearOfscv排序的更多相关文章

  1. php实例根据ID删除mysql表中的数据

    在动态网站开发中,我们经常要根据ID删除表中的数据,例如用户删除帖子,就需要根据ID删除帖子.本文章向大家介绍php根据ID删除表中数据的实例,需要的朋友可以参考一下本文章的实例. php实例根据ID ...

  2. liferay中如何获取实例的id和portletId

    在Portlet中request分为两种renderRequet和actionRequest而portlet需要取得实例Id的时候都在renderRequest的时候才可以取到,如下例子 Portle ...

  3. C#_IComparable实例 - 对象ID进行排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Comp ...

  4. java学习--自定义类的实例的大小比较和排序

    我们知道Object类有一个equals方法,用于比较两个对象是否相等 我们只要在自定义类中重写了equals方法(若不重写就是比较两个实例的地址,相当于==)就可以用来比较该类的两个实例是否相等 问 ...

  5. 如何将RAC数据库的 RMAN Disk 备份 Restore 到另一个节点上的单个实例 (Doc ID 415579.1)

    HowTo Restore RMAN Disk backups of RAC Database to Single Instance On Another Node (Doc ID 415579.1) ...

  6. 让mysql返回的结果按照传入的id的顺序排序

    比如id为 1,3,5,44,66,32,21,6 那么返回的结果顺序也是这个顺序   $sql = "select * from ".$this->tableName(). ...

  7. mysql 对数据的自增ID重新进行排序

    创建表格时添加: create table table1(id int auto_increment primary key,...) 创建表格后添加: 删除原有主键: ALTER TABLE `ta ...

  8. [C][代码实例]整型数组二分排序

    #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h& ...

  9. 【Python】【demo实验9】【练习实例】【三数排序】

    原题: 输入三个整数x,y,z,请把这三个数由小到大输出. 我的解法: #!/usr/bin/python # encoding=utf-8 # -*- coding: UTF-8 -*- # 输入三 ...

随机推荐

  1. Java [leetcode 17]Letter Combinations of a Phone Number

    题目描述: Given a digit string, return all possible letter combinations that the number could represent. ...

  2. Hibernate4.x之映射关系--多对多

    n-n的关联关系分为以下两类: 1.单向n-n关联关系: n-n的关联必须使用连接表 与1-n映射类似,必须为set集合元素添加key子元素,指定CATEGORIES_ITEMS表中参照CATEGOR ...

  3. NGINX开篇

    前言 最近空闲时间比较多, 开始阅读nginx源码, 阅读的过程总结和笔记整理了下, 汇集成了一个系列的文章, 由于nginx功能实在太多, 没法做到面面俱到, 只对已经阅读过的源码进行记录总结, 以 ...

  4. HDU 4009 Transfer water 最小树形图

    分析:建一个远点,往每个点连建井的价值(单向边),其它输水线按照题意建单向边 然后以源点为根的权值最小的有向树就是答案,套最小树形图模板 #include <iostream> #incl ...

  5. js跟着鼠标移动的文字

    废话不多说,直接上代码,有注释: <head> <title></title> <style type="text/css"> sp ...

  6. bzoj 2716 天使玩偶(CDQ分治,BIT)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=29234 [题意] 询问当前点与已知点的最小曼哈顿距离. [思路 ...

  7. empty(trim($str))报错原因

    最近写程序的时候发现一个这样的问题,一个if判断如下: [php] if (!empty(trim($ch_url))) { ... } [/php] 执行程序报出如下错误: [code] Fatal ...

  8. C语言不支持默认参数,不过可以用宏来模拟

    C语言不支持默认参数,不过可以用宏来模拟: //--------------------------------------------------------------------------- ...

  9. 用Java实现一个通用并发对象池

    这篇文章里我们主要讨论下如何在Java里实现一个对象池.最近几年,Java虚拟机的性能在各方面都得到了极大的提升,因此对大多数对象而言,已经没有必要通过对象池来提高性能了.根本的原因是,创建一个新的对 ...

  10. 查找进程对应的PID和对应的端口号

    第一步:首先打开任务管理器.之后左键单击查看,点击下面的选择列. 第二步:之后进入如下界面,把PID勾上.这是我们就可以查看到进程的PID(process id)号了 第三步:首先我们打开DOS窗口, ...