委托示例(利用委托对不同类型的对象数组排序)

  1using System;
  2using System.Collections.Generic;
  3using System.Text;
  4
  5namespace delegateTest
  6{
  7    /**//// <summary>
  8    /// 演示利用委托给不同类型的对象排序
  9    /// </summary>
 10    class Program
 11    {
 12        delegate bool CompareOp(object lhs,object rhs);//声明委托(注意方法签名的格式是两个object类型参数)
 13
 14        static void Main(string[] args)
 15        {
 16            Employee[] employees = {
 17                new Employee("Bugs Bunny",20000),
 18                new Employee("Elmer Fudd",10000),
 19                new Employee("Daffy Duck",25000),
 20                new Employee("Wiley Coyote",(decimal)1000000.38),
 21                new Employee("Foghorn Leghorn",23000),
 22                new Employee("Road Runner",50000)
 23            };
 24
 25            CompareOp c1 = new CompareOp(Employee.CompareEmploySalary);
 26
 27            BubbleSorter.Sort(employees, c1);//对employees数组,按工资高低排序
 28
 29            for (int i = 0; i < employees.Length; i++)
 30            {
 31                Console.WriteLine(employees[i].ToString());
 32            }
 33
 34            Console.WriteLine("---------------------------------------");
 35
 36            object[] ints = { 3, 5, 2, 8, 6, 0 };
 37
 38            c1 = new CompareOp(CompareInt);
 39            BubbleSorter.Sort(ints, c1);//对ints数组,按数值大小排序
 40            for (int i = 0; i < ints.Length; i++)
 41            {
 42                Console.WriteLine(ints[i].ToString());
 43            }
 44
 45            Console.WriteLine("---------------------------------------");           
 46
 47            Console.ReadLine();
 48        }
 49
 50        /**//// <summary>
 51        /// 比较整数的大小
 52        /// </summary>
 53        /// <param name="x">整数1</param>
 54        /// <param name="y">整数2</param>
 55        /// <returns>如果第一个数小于第二数,返回true,反之false</returns>
 56        static bool CompareInt(object x, object y) 
 57        
 58            return (int)y>(int)x?true:false;
 59        }
 60
 61        /**//// <summary>
 62        /// 冒泡排序类
 63        /// </summary>
 64        class BubbleSorter
 65        {
 66            static public void Sort(object[] sortArray, CompareOp gtMethod)
 67            {
 68                for (int i = 0; i < sortArray.Length; i++)
 69                {
 70                    for (int j = i + 1; j < sortArray.Length; j++)
 71                    {
 72                        if (gtMethod(sortArray[j], sortArray[i])) //比较大小,注:不同的object,比较大小的方法不同,比如Employee是按工资高低来比较,int是按数字大小来比较,利用委托的好处就在于不用管具体用哪种方法,具体调用的时候才确定用哪种方法
 73                        {
 74                            object temp = sortArray[i];
 75                            sortArray[i] = sortArray[j];
 76                            sortArray[j] = temp;
 77                        }
 78                    }
 79
 80                }
 81            }
 82        }
 83    }
 84
 85    
 86    /**//// <summary>
 87    /// 员工实体类
 88    /// </summary>
 89    class Employee 
 90    {
 91        private string name;
 92        private decimal salary;
 93
 94
 95        /**//// <summary>
 96        /// Employee构造函数
 97        /// </summary>
 98        /// <param name="name"></param>
 99        /// <param name="salary"></param>
100        public Employee(string name, decimal salary) 
101        {
102            this.name = name;
103            this.salary = salary;
104        }
105
106        /**//// <summary>
107        /// 覆盖ToString()方法
108        /// </summary>
109        /// <returns></returns>
110        public override string ToString()
111        {
112            return string.Format(name + ",{0:c}", salary);
113        }
114
115        /**//// <summary>
116        /// 按员工工资高低比较大小
117        /// </summary>
118        /// <param name="lhs"></param>
119        /// <param name="rhs"></param>
120        /// <returns></returns>
121        public static bool CompareEmploySalary(object lhs, object rhs) 
122        {
123            Employee empLhs = (Employee)lhs;
124            Employee empRhs = (Employee)rhs;
125            return (empRhs.salary > empLhs.salary) ? true : false;
126        }
127    }
128}
129

运行结果:
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
---------------------------------------

时间: 2024-09-20 11:39:42

委托示例(利用委托对不同类型的对象数组排序)的相关文章

c#中利用委托反射将DataTable转换为实体集的代码_C#教程

类泛型的约束: 复制代码 代码如下: public static class ToModel<T> where T : class, new() 定义委托: 复制代码 代码如下: public delegate void SetString(string value); 创建委托方法: 复制代码 代码如下: private static SetString CreateStringDelegate(T model, string propertyName) { MethodInfo mi =

利用委托异步发送邮件

故事是这样发生的: 越来越多的用户在网站购买了东西,每成功订下一个定单,就要向用户的邮箱发送一封EMAIL.当邮件正在发送时,占用的资源会非常多,用户也需要等待,用户越多,这样用户页面上的等待时间就会变得很长,为了解决这个问题,决定把发送EMAIL和短信的都改成异步执行的. 异步发送邮件,有两种做法:一种是大家在网上一搜就能找到一堆的发送方法,这种方法都是在发送email的时候再进行异步操作,如这篇文章()中写到的. 但是这种方法在我这里需要的成本太高,因为发送邮件的方法是封装好的,不便更改,所

艾伟_转载:把委托说透(1):开始委托之旅 委托与接口

委托,本是一个非常基础的.NET概念,但前一阵子在园子里却引起轩然大波.先是Michael Tao的随笔让人们将委托的写法与茴香豆联系到了一起,接着老赵又用一系列文章分析委托写法的演变,并告诫"嘲笑孔乙己的朋友们,你们在一味鄙视"茴"的四种写法的同时,说不定也失去了一个了解中国传统文化的机会呢!". 在我个人看来,委托是.NET Framework中一个非常炫的特性,绝不会向有些评论里说的那样,根本没有机会接触.恰恰相反,我们几乎每天都会接触委托,使用委托. 其实园

从反射看委托与事件 委托真的是一个类

关于委托与事件,网上介绍得非常之多,在此不再赘述,本人最近需要捣鼓一些委托,因而对委托进行一 定的寻根究底,故用反射把委托的成员揪出来,且看如下代码: delegate void DelegateDemo(); static event DelegateDemo delHandle; static void Main() { delHandle += new DelegateDemo(MyDelegate_delHandle); MemberInfo[] mis = delHandle.GetT

C#委托基础1——委托基础

  C#委托基础系列原于2011年2月份发表在我的新浪博客中,现在将其般至本博客. 委托和其委托的方法必须具有相同的签名.签名相同:1.参数类型相同 2.参数数量相同 3.返回值一致   例一 class Program { public delegate int MathMethod(int x, int y); public int Add(int a, int b) { return a + b; } static void Main(string[] args) { MathMethod

Javascript实例教程(8) 利用Javascript基于浏览器类型的重定向

javascript|教程|浏览器 利用javascript基于浏览器类型的重定向 基于浏览器类型的重定向的实现可以通过使用javascript函数来检查navigator.userAgent的字符串"MSIE",它将告诉你用户是否使用Microsoft Internet Explorer(微软的IE浏览器).通过修改windows.location函数可以重定向到正确的URL(同意资源定位器).下面是详细的代码: <HTML> <HEAD> <SCRIP

另类PHP安全漏洞:利用弱类型和对象注入进行SQLi

本文讲的是另类PHP安全漏洞:利用弱类型和对象注入进行SQLi,最近,我在一个目标中寻找漏洞时,遇到了一个正在运行Expression Engine(一个CMS平台)的主机. 这个特殊的应用程序吸引了我,因为当我尝试使用 "admin" 为用户名登录该应用程序时,服务器响应的cookie中包含了PHP序列化数据. 如我们之前所说过的,反序列化用户提供的数据可能导致意外的结果; 在某些情况下,甚至会导致代码执行. 于是,我决定仔细检查一下,而不是盲目的去测试,先看看我能否可以下载到这个C

printf-(c语言)利用%ld读取double类型,程序可以运行,但是结果是很大的负数?

问题描述 (c语言)利用%ld读取double类型,程序可以运行,但是结果是很大的负数? #include #define TAX_1 17850 #define TAX_2 23900 #define TAX_3 29750 #define TAX_4 14875 #define TAXRATE_1 0.15 #define TAXRATE_2 0.28 int main(void) { double taxsalary,taxpay; int n; printf("Please enter

class-vector利用自己定义的类型出错,其解答

问题描述 vector利用自己定义的类型出错,其解答 #include #include using namespace std; class Node { public: Node(); void SetX(int); int GetX(); private: int x; }; Node::Node() { x = 0; } int Node::GetX() { return x; } void Node::SetX(int i) { x = i; } class test { public