调用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. Maven配置文件Pom.xml详解

    <project xmlns="http://maven.apache.org/POM/4.0.0 "      xmlns:xsi="http://www.w3. ...

  2. 学习面试题Day09

    一.Java基础部分 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相 ...

  3. 使用SignalR 提高B2C商城用户体验1

    vs2010 使用SignalR 提高B2C商城用户体验(一) 1.需求简介,做为新时代的b2c商城,没有即时通讯,怎么提供用户粘稠度,怎么增加销量,用户购物的第一习惯就是咨询,即时通讯,应运而生.这 ...

  4. Doing Homework(HDU 1074状压dp)

    题意:给你n个要做的作业,它们的名字.期限.可完成所需天数(必须连续)在规定期限不能完成要扣分(每天一分)求做作业顺序使扣分最少. 分析:作业数量较少,用状态压缩,做到第i种作业花费的天数dp[i]. ...

  5. adaboost学习资料收集

    很通俗易懂的一篇博文 http://blog.csdn.net/haidao2009/article/details/7514787 百度搜索研发部的一篇文章 http://stblog.baidu- ...

  6. C#中克隆随机数的三种方法(为什么我想到了茴字的四种写法

    C#中的Random类可以用来产生伪随机数(正确的废话 伪随机数的一个性质就是给定一个初始种子,那么产生的随机数列都是相同的,这个性质非常适合用在不同环境之间同步逻辑的场景. 最近有一个要克隆当前随机 ...

  7. HDU2296——Ring(AC自动机+DP)

    题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...

  8. DTD - Attributes

    In a DTD, attributes are declared with an ATTLIST declaration. Declaring Attributes An attribute dec ...

  9. url 中文编解码

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  10. mssql游标demo

    declare @billIds varchar(400) declare @billId varchar(40) DECLARE c1 CURSOR FOR select top 5 SaleNo ...