BubbleSort - 实用委托

  概述:

    排序类,可以对任意类型的对象进行排序,包括基本数据类型;

    对象类,不仅定义本身数据,同时包含了排序的细节.

  排序类(BubbleSorter):

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace BubbleSorter {
 7     class BubbleSorter {
 8         public static void Sort<T>(IList<T> list, Func<T, T, bool> comparison) {
 9             bool swapped;    //标识是否进行交互操作.
10             for (int i = 0; i < list.Count - 1; i++) {
11                 swapped = false;
12                 for (int j = 0; j < list.Count - 1 - i; j++) {
13                     if (comparison(list[j], list[j + 1])) {
14                         Swap<T>(list, j, j + 1);
15                         swapped = true;
16                     }
17                 }
18                 if (!swapped) //不进行交互,标识已排好序.
19                     break;
20             }
21         }
22
23         private static void Swap<T>(IList<T> list, int i, int j) {
24             T tmp = list[i];
25             list[i] = list[j];
26             list[j] = tmp;
27         }
28     }
29 }

  对象类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace BubbleSorter {
 7     class Employee {
 8         public string Name { get; private set; }
 9         public decimal Salary { get; private set; }
10
11         public Employee(string name, decimal salary) {
12             Name = name;
13             Salary = salary;
14         }
15
16         public override string ToString() {
17             return string.Format("{0} {1:C}",Name, Salary); //默认保留两位小数.
18         }
19
20         public static bool CompareSalary(Employee e1, Employee e2) {
21             return e1.Salary < e2.Salary;   //按照Salary的降序排序.
22         }
23     }
24 }

  调用类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace BubbleSorter {
 7     class Program {
 8         static void Main(string[] args) {
 9             Employee[] emplyees = new Employee[]{
10                 new Employee("Bugs Bunny", 2),
11                 new Employee("Elmer Fudd", 10),
12                 new Employee("Daffy Duck", 2.5m),
13                 new Employee("Wile Coyote", 100.38m),
14                 new Employee("Foghorn Leghorn", 2.3m),
15                 new Employee("RoadRunner", 5)
16             };
17             Console.WriteLine("before sort:");
18             foreach (Employee e in emplyees) {
19                 Console.WriteLine(e);
20             }
21
22             BubbleSorter.Sort<Employee>(emplyees, Employee.CompareSalary);
23
24             Console.WriteLine("after sort:");
25             foreach (Employee e in emplyees) {
26                 Console.WriteLine(e);
27             }
28         }
29     }
30 }

  output:

 1 before sort:
 2 Bugs Bunny ¥2.00
 3 Elmer Fudd ¥10.00
 4 Daffy Duck ¥2.50
 5 Wile Coyote ¥100.38
 6 Foghorn Leghorn ¥2.30
 7 RoadRunner ¥5.00
 8 after sort:
 9 Wile Coyote ¥100.38
10 Elmer Fudd ¥10.00
11 RoadRunner ¥5.00
12 Daffy Duck ¥2.50
13 Foghorn Leghorn ¥2.30
14 Bugs Bunny ¥2.00
时间: 2024-10-06 02:30:19

BubbleSort - 实用委托的相关文章

Delegate(委托)

在前面lambda章节中稍微提了一下委托,今天这章就让我们来深究一下委托. 委托的本质是一种类,他是继承MulticastDelegate类的. 而声明委托的关键字的delegate,如:public delegate void NoReturnNoParaOutClass(); 但是刚才也讲了委托一种类,那按照类的声明,我们应该可以这样声明一个委托. public class  NoReturnNoParaOutClass: System.MulticastDelegate { } 只不过由于

[转载]C#深入分析委托与事件

原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 引言 本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Deleg

C#综合揭秘——深入分析委托与事件

本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单.在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用.最后一节,将介绍Predicate<T>.Action<T>.Func<T,TResult>多种泛型委托的使用和Lamb

C++:关于委托类

转自:http://blog.csdn.net/dadalan/article/details/4041931.vs2010已经支持function/bind,能很好实现委托. [说明] 本文不仅介绍了C++语言应用非常好的一种方法(我甚至觉得应该将它归结为一种设计模式),而且也是对C#语言中委托特性底层实现的一个很好的说明. 阅读本文,你应当对委托的概念有所了解:在讨论委托是实现时,你应当对标准模板库(STL)中的list容器以及迭代器(iterator)有所了解. 在这篇文章中,暂不讨论类成

ServiceModel 元数据实用工具 (Svcutil.exe)

ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档 一.SvcUtil.exe ServiceModel 元数据实用工具可在 Windows SDK 安装位置中找到,具体位置为 C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin 功能 下表概括了此工具提供的各种功能,以及论述如何使用该工具的对应主题. 任务 主题 依据运行的服务或静态元数据文档生成代码 根据服务元数据生成 WCF 客户端 从

《C#本质论》读书笔记(12)委托和Lambda表达式

12.1. 委托概述 12.1.2 委托的数据类型 为了减少重复代码数量,可以将比较方法作为参数传递给 BubbleSort()方法.此外,为了将方法作为参数传递,必须有一个能够标识方法的数据类型--也就是委托.这里的委托类型是 ComparisonHandler .  c# 2.0之前的写法 class DelegateSample { static void Main(string[] args) { //int[] arr = { 10, 20, 30, 40, 50 }; int[] a

c# 委托和事件(总结篇)

c# 委托和事件(总结篇) 概念: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够 拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针 十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比, delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优

十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

委托与Lambda表达式 1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树 一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来提供相同的功能, 它将方法作为对象封装起来,允许在"运行时"间接地绑定一个方法调用. 声明的委托相当于一种自定义的数据类型. 1.背景 冒泡排序 1 static class SimpleSort1 2 { 3 public static void BubbleSort(int[] items)

委托、Lambda表达式和事件

1.1 引用方法      委托是寻址方法的 .NET 版本.委托是类型安全的类.它定义了返回类型和参数的类型.委托类不仅包含对方法的引用,也可以包含对多个方法的引用. Lambda 表达式与委托直接相关.当参数是委托类型时,就可以使用Lambda表达式实现委托引用的方法. 1.2委托      当要把 方法 传送给其他方法时,需要使用 委托.以下两个示例: 启动线程和任务--在C# 中,可以告诉计算机并行运行某些新的执行序列同时运行当前的任务.这种序列就是称为线程,在其中一个基类 System