委托示例(利用委托对不同类型的对象数组排序)
时间:2022-04-23
本文章向大家介绍委托示例(利用委托对不同类型的对象数组排序),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
using System;
using System.Collections.Generic;
using System.Text;
namespace delegateTest
{
/// <summary>
/// 演示利用委托给不同类型的对象排序
/// </summary>
class Program
{
delegate bool CompareOp(object lhs,object rhs);//声明委托(注意方法签名的格式是两个object类型参数)
static void Main(string[] args)
{
Employee[] employees = {
new Employee("Bugs Bunny",20000),
new Employee("Elmer Fudd",10000),
new Employee("Daffy Duck",25000),
new Employee("Wiley Coyote",(decimal)1000000.38),
new Employee("Foghorn Leghorn",23000),
new Employee("Road Runner",50000)
};
CompareOp c1 = new CompareOp(Employee.CompareEmploySalary);
BubbleSorter.Sort(employees, c1);//对employees数组,按工资高低排序
for (int i = 0; i < employees.Length; i++)
{
Console.WriteLine(employees[i].ToString());
}
Console.WriteLine("---------------------------------------");
object[] ints = { 3, 5, 2, 8, 6, 0 };
c1 = new CompareOp(CompareInt);
BubbleSorter.Sort(ints, c1);//对ints数组,按数值大小排序
for (int i = 0; i < ints.Length; i++)
{
Console.WriteLine(ints[i].ToString());
}
Console.WriteLine("---------------------------------------");
Console.ReadLine();
}
/// <summary>
/// 比较整数的大小
/// </summary>
/// <param name="x">整数1</param>
/// <param name="y">整数2</param>
/// <returns>如果第一个数小于第二数,返回true,反之false</returns>
static bool CompareInt(object x, object y)
{
return (int)y>(int)x?true:false;
}
/// <summary>
/// 冒泡排序类
/// </summary>
class BubbleSorter
{
static public void Sort(object[] sortArray, CompareOp gtMethod)
{
for (int i = 0; i < sortArray.Length; i++)
{
for (int j = i + 1; j < sortArray.Length; j++)
{
if (gtMethod(sortArray[j], sortArray[i])) //比较大小,注:不同的object,比较大小的方法不同,比如Employee是按工资高低来比较,int是按数字大小来比较,利用委托的好处就在于不用管具体用哪种方法,具体调用的时候才确定用哪种方法
{
object temp = sortArray[i];
sortArray[i] = sortArray[j];
sortArray[j] = temp;
}
}
}
}
}
}
/// <summary>
/// 员工实体类
/// </summary>
class Employee
{
private string name;
private decimal salary;
/// <summary>
/// Employee构造函数
/// </summary>
/// <param name="name"></param>
/// <param name="salary"></param>
public Employee(string name, decimal salary)
{
this.name = name;
this.salary = salary;
}
/// <summary>
/// 覆盖ToString()方法
/// </summary>
/// <returns></returns>
public override string ToString()
{
return string.Format(name + ",{0:c}", salary);
}
/// <summary>
/// 按员工工资高低比较大小
/// </summary>
/// <param name="lhs"></param>
/// <param name="rhs"></param>
/// <returns></returns>
public static bool CompareEmploySalary(object lhs, object rhs)
{
Employee empLhs = (Employee)lhs;
Employee empRhs = (Employee)rhs;
return (empRhs.salary > empLhs.salary) ? true : false;
}
}
}
运行结果:
Elmer Fudd,¥10,000.00
Bugs Bunny,¥20,000.00
Foghorn Leghorn,¥23,000.00
Daffy Duck,¥25,000.00
Road Runner,¥50,000.00
Wiley Coyote,¥1,000,000.38
---------------------------------------
0
2
3
5
6
8
---------------------------------------
- 让VIM支持Python2 by update-alternatives
- Angular中ngCookies模块介绍
- 如何让jboss eap 6.2+ 的多个war应用共享 jar 包?
- scala 学习笔记(07) 一等公民的函数
- 让BASH,VIM美美的Powerline
- 极品三数666.cn易主,价格让人大惊!
- ui-router中使用ocLazyLoad和resolve
- rpc框架之 avro 学习 2 - 高效的序列化
- rpc框架之HA/负载均衡构架设计
- 使用Docker-Docker for Web Developers(2)
- 打造高效前端工作环境-tmuxinator
- 在Linux Mint上安装node.js和npm
- JS魔法堂:再识Number type
- (cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python爬取杜赛博客教程内容,应用pdfkit打印pdf文件
- Java程序员必须知道的常用序列化技术及选型,Protobuf 原理详解
- Python异步编程之 协程 & asyncio & 异步
- Redis入坟(八)内存管理与优化,面试必考
- 逐行阅读Spring5.X源码(十二)AOP源码分析,难!面试官都不一定懂!
- 逐行阅读Spring5.X源码(十三)spring事务源码分析
- 线程池ThreadPoolExecutor 源码分析,面试官也就那么回事,他怎么敢!
- Spug - 轻量级自动化运维平台
- Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
- 优雅的drop掉mysql库中1TB大表
- 《剑指offer》第19天:股票交易(校对)
- SwiftyUserDefaults-封装系统本地化的框架推荐
- “使用多target来构建大量相似App”,唐巧大神理论验证(附工程代码地址)
- 小结:Swift、OC语言中多target在代码中如何区分
- 点击按钮每次都能实现图片的旋转和切换(swift)