-
C#教程之深入IComparable与IComparer的排序实例详解
如下所示:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace hgoApp
{
class Comparer
{
static void Main()
{
Employee[] Employees = new Employee[5];
Employees[0] = new Employee("张三", 2800);
Employees[1] = new Employee("李四", 1800);
Employees[2] = new Employee("王五", 5800);
Employees[3] = new Employee("马六", 12800);
Employees[4] = new Employee("钱七", 8800);
Console.WriteLine("按照姓名排序");
Array.Sort(Employees);
foreach (Employee em in Employees)
{
Console.WriteLine(em);
}
Console.WriteLine("按照薪水排序");
Array.Sort(Employees, Employee.SalaryCom);
foreach (Employee em in Employees)
{
Console.WriteLine(em);
}
}
}
class Employee : IComparable
{
private string _Name;
public string Name
{
get { return _Name; }
}
private int _Salary;
public int Salary
{
get { return _Salary; }
}
public Employee(string Name, int Salary)
{
_Name = Name;
_Salary = Salary;
}
//显示接口实现
int IComparable.CompareTo(object obj)
{
if (!(obj is Employee))
{
throw new ArgumentException("不是Employee类");
}
return _Name.CompareTo(((Employee)obj)._Name);
}
//提供一个公用的强类型重载版本
public int CompareTo(Employee Em)
{
return _Name.CompareTo(Em._Name);
}
//当第一次实例化Employee的时候,_SalaryCom为空,当使用SalaryCom时,就会创建一个SalaryCompare对象,第2次,3次的时候,就可以直接使用_SalaryCom了
private static SalaryCompare _SalaryCom = null;
public static IComparer SalaryCom
{
get
{
if (_SalaryCom == null)
{
_SalaryCom = new SalaryCompare();
}
return _SalaryCom;
}
}
//嵌套类(这个类是针对薪水进行排序的类)
private class SalaryCompare:IComparer
{
//使用指定的IComparer对Array中的元素进行排序
int IComparer.Compare(object obj1,object obj2)
{
if (!(obj1 is Employee) || !(obj2 is Employee))
{
throw new ArgumentException("不是Employee类");
}
return ((Employee)obj1)._Salary.CompareTo(((Employee)obj2)._Salary);
}
}
public override string ToString()
{
return _Name +" "+ _Salary.ToString();
}
}
}
复制代码 代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace hgoApp
{
class Comparer
{
static void Main()
{
Employee[] Employees = new Employee[5];
Employees[0] = new Employee("张三", 2800);
Employees[1] = new Employee("李四", 1800);
Employees[2] = new Employee("王五", 5800);
Employees[3] = new Employee("马六", 12800);
Employees[4] = new Employee("钱七", 8800);
Console.WriteLine("按照姓名排序");
Array.Sort(Employees);
foreach (Employee em in Employees)
{
Console.WriteLine(em);
}
Console.WriteLine("按照薪水排序");
Array.Sort(Employees, Employee.SalaryCom);
foreach (Employee em in Employees)
{
Console.WriteLine(em);
}
}
}
class Employee : IComparable
{
private string _Name;
public string Name
{
get { return _Name; }
}
private int _Salary;
public int Salary
{
get { return _Salary; }
}
public Employee(string Name, int Salary)
{
_Name = Name;
_Salary = Salary;
}
//显示接口实现
int IComparable.CompareTo(object obj)
{
if (!(obj is Employee))
{
throw new ArgumentException("不是Employee类");
}
return _Name.CompareTo(((Employee)obj)._Name);
}
//提供一个公用的强类型重载版本
public int CompareTo(Employee Em)
{
return _Name.CompareTo(Em._Name);
}
//当第一次实例化Employee的时候,_SalaryCom为空,当使用SalaryCom时,就会创建一个SalaryCompare对象,第2次,3次的时候,就可以直接使用_SalaryCom了
private static SalaryCompare _SalaryCom = null;
public static IComparer SalaryCom
{
get
{
if (_SalaryCom == null)
{
_SalaryCom = new SalaryCompare();
}
return _SalaryCom;
}
}
//嵌套类(这个类是针对薪水进行排序的类)
private class SalaryCompare:IComparer
{
//使用指定的IComparer对Array中的元素进行排序
int IComparer.Compare(object obj1,object obj2)
{
if (!(obj1 is Employee) || !(obj2 is Employee))
{
throw new ArgumentException("不是Employee类");
}
return ((Employee)obj1)._Salary.CompareTo(((Employee)obj2)._Salary);
}
}
public override string ToString()
{
return _Name +" "+ _Salary.ToString();
}
}
}
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式