通过代码学习C#&.NET——委托使用(通用类设计)
来源:互联网 发布:python中的生成器 编辑:程序博客网 时间:2024/05/22 05:10
代码编写及运行环境Visual Studio 2010 .NET v4.0.30319
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DelegateUseInCommonClass{ /// <summary> /// 一般通用类的设计都包含一些标准的任务代码,这些代码包含任务如何执行的逻辑,但是有的时候这些任务包含一些 /// 子任务,只有具体使用通用类的对象才知道如何执行这些子任务,比如说: /// 建立了一个给对象排序的通用类,在使用的时候需要知道具体的排序规则才能顺利完成排序,比如int对象是比较大小, /// string对象是比较第一个字母,一些复杂对象可能是比较其中的某个属性值完成排序。 /// 这种情况可以通过委托实现,对于子任务使用委托,可以方便通用类的使用者具体执行执行子任务的方式。 /// </summary> class Program { static void Main(string[] args) { //定义并初始化不同类型的三个数组 int[] intItems = { 12, 2, 4, 5, 78, 32, 12, 65 }; string[] stringItems = { "test", "best", "active", "card", "book" }; Person[] personItems = { new Person(12, "Mark"), new Person(45, "Mary"), new Person(32, "Oscar"), new Person(80, "Kele"),new Person(12,"Ada") }; #region Int类型的排序 Console.WriteLine("intItems排序前:"); Console.Write(" "); foreach (int i in intItems) { Console.Write(string.Format("{0,-4}", i)); } Console.WriteLine(); //给intItems排序 CommonClass.Sort<int>(intItems, (item1, item2) => { if (item1 > item2) return true; else return false; }); Console.WriteLine("intItems按Int值从小到大排序后:"); Console.Write(" "); foreach (int i in intItems) { Console.Write(string.Format("{0,-4}", i)); } Console.WriteLine(); #endregion #region String类型的排序 Console.WriteLine("stringItems排序前:"); Console.Write(" "); foreach (string str in stringItems) { Console.Write(string.Format("{0,-10}", str)); } Console.WriteLine(); //给stringItems排序 CommonClass.Sort<string>(stringItems, (item1, item2) => { if (item1.CompareTo(item2) > 0) return true; else return false; }); Console.WriteLine("stringItems按string首字母排序后:"); Console.Write(" "); foreach (string str in stringItems) { Console.Write(string.Format("{0,-10}",str)); } Console.WriteLine(); #endregion #region Person类型的排序 Console.WriteLine("personItems排序前:"); foreach (Person per in personItems) { Console.WriteLine(string.Format(" Person: Name-{0,-10}Age-{1}",per.Name,per.Age)); } CommonClass.Sort<Person>(personItems, (item1, item2) => { if (item1.Age > item2.Age) return true; else return false; }); Console.WriteLine("personItems按年龄从小到大排序后:"); foreach (Person per in personItems) { Console.WriteLine(string.Format(" Person: Name-{0,-10}Age-{1}", per.Name, per.Age)); } CommonClass.Sort<Person>(personItems, (item1, item2) => { if (item1.Name.CompareTo(item2.Name)>0) return true; else return false; }); Console.WriteLine("personItems按姓名首字母排序后:"); foreach (Person per in personItems) { Console.WriteLine(string.Format(" Person: Name-{0,-10}Age-{1}", per.Name, per.Age)); } #endregion } //定义Person类 class Person { private int _Age; private string _Name; public int Age { get { return _Age; } set { _Age = value; } } public string Name { get { return _Name; } set { _Name = value; } } public Person(int age, string name) { _Age = age; _Name = name; } } } #region 比较通用类设计 /// <summary> /// 此处使用排序来说明委托在通用类中的使用,此方法在多本C#说中都有介绍,包括: /// 《C#本质论》 /// 《C#高级编程》 /// </summary> class CommonClass { //定义用于比较两个对象并返回bool类型的委托类型 public delegate bool Compare<T>(T item1, T item2); //通用排序方法,可以用于比较任何对象,具体比较结果依赖于子任务Compare<T>类型的compare public static void Sort<T>(T[] items, Compare<T> compare) { for (int i = 0; i < items.Count()-1; i++) { for (int j = i; j < items.Count(); j++) { if (compare(items[i], items[j])) { T temp = items[i]; items[i] = items[j]; items[j] = temp; } } } } } #endregion}
运行结果:
- 通过代码学习C#&.NET——委托使用(通用类设计)
- 通过代码学习C#&.NET——委托使用(通用类设计)
- 通过代码学习C#&.NET——委托使用(线程、任务)
- 通过代码学习C#&.NET——委托使用(事件、定时处理)
- 通过代码学习C#&.NET——委托使用(正则表达式替换)
- 通过代码学习C#&.NET——委托基础
- .NET 加密 通用代码(c#)
- 【unity】【Code】【Event事件】通用代码库(三)——Unity事件与委托
- 设计模式——委托代码示例
- .NET技术学习:C#中的委托
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程编程委托使用的实例(五)
- C#——委托
- C#——委托
- .NET Romoting 学习总结(三)—— Remoting技术之设计模式实现代码安全
- C#-—体验委托
- C#—委托
- Objective-C——协议(Protocol)详解与代理(委托)设计模式
- 委托、事件与Observer设计模式——学习笔记
- 异步IO网络服务器设计(二) 读操作
- iOS5编程--官方例子代码研究--5.TableMultiSelect
- 回调函数
- CXF 简单教程初级版
- POJ 3615
- 通过代码学习C#&.NET——委托使用(通用类设计)
- RQNOJ 34
- Delphi设计带图标的菜单.6
- ubunt 下安装vim
- 设置yum工具
- 用c实现进程监控,如果某一进程退出则重启
- 随想、、、
- android中MediaPlayer和SoundPool的声音管理
- strlen 与 sizeof