当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 利用"委托"实现对象实例按"多字段嵌套"排序

ASP.NET
不同映射模式下的直线输出的效果问题
ASP.NET开发下的MVC设计模式的实现
ASP.NET编写应用程序的十大技巧
ASP.NET中使用AJAX的简单方法
ASP.NET MVC实现自己的视图引擎
认识asp.net会话状态
ASP.NET实现页面传值的几种方法
.NET中容易混淆的几组重要概念
详解.NET中的动态编译技术
如何使用ASP.Net加密Cookie
ASP.NET 2.0跨网页提交的三种方法
ASP.NET 2.0创建母版页引来的麻烦
.Net整合其他平台的一些探讨
ASP.NET编程经验技巧10则
最佳实践 ADO.NET实用经验无保留曝光
在.NET上执行多线程操作要考虑的两大因素
.Net开发 细说Visual Basic.Net
ASP.NET网络编程中经常用到的27个函数集
ASP.NET防止用户多次登录的方法
对ASP.NET MVC项目中的视图做单元测试

ASP.NET 中的 利用"委托"实现对象实例按"多字段嵌套"排序


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 165 ::
收藏到网摘: n/a

/*利用"委托"实现对象实例按"多字段嵌套"排序 (不知道大家看懂题目了? 功能还是挺实用的!)本文实现 Person 类的实例们按 年龄、身高、体重等字段嵌套排序!就像 SQL 查询的 Order By 字段1,字段2,...,字段n 子句的效果一样! */ using System;class Class1 //客户程序{ static void Main() { Person[] Persons = { // 姓名、年龄、身高、体重 new Person("张栢芝", 71,178,49) ,new Person("章子怡", 23,177,33) ,new Person("周 迅", 71,180,80) ,new Person("徐静蕾", 12,150,70) ,new Person("赵 薇", 23,166,60) ,new Person("宋丹丹", 50,183,50) ,new Person("翠花儿", 23,177,34) ,new Person("赵丽蓉", 50,184,40) ,new Person("郭晶晶", 50,184,41) }; //"BubbleSorter.CompareOp 委托" 类型数组的元素顺序,规定了嵌套排序的顺序,即: //先按"年龄(Age)"排序,如果一样再按"身高(Height)",如果还一样再按"体重(Weight)"! //注意这只是排序的结果而以,如果要按此思路编下去,就有"递归"的意思了,然而层次却无法确定! Sorter.CompareOp[] PersonCompareOp = { // 你可以调换元素顺序,来改变排序的字段顺序 new Sorter.CompareOp(Person.PrevIsOlderThanNext) ,new Sorter.CompareOp(Person.PrevIsHigherThanNext) ,new Sorter.CompareOp(Person.PrevIsHeavierThanNext) }; // 转到 Person 类 和 BubbleSorter 类的实现! Sorter.BubbleSort(Persons, PersonCompareOp); for (int i = 0; i < Persons.Length; i++) Console.WriteLine(Persons[i].ToString()); Console.ReadLine(); }} class Person{ private string _name; private int _age; private int _weight; private int _height; public Person(string Name,int Age,int Height,int Weight) { this._name = Name; this._age = Age; this._height = Height; this._weight = Weight; } public override string ToString() { return string.Format(_name + ", {0:N}, {1:N}, {2:N}", _age,_height,_weight); } // 下面"额外"定义了若干与委托签名一致匹配的静态方法,供"委托调用" // 返回值为"真"时,代表 "前一元素 <= 后一元素" ,否则为"假"! // 只要参照这里,我们可以为类添加的排序功能并定义排序规则! // 多么简单啊! 剩下的工作就都留给 "排序功能(工具)类" 去做吧! public static bool PrevIsOlderThanNext(Object Prev, Object Next) { // 这里一定要用 "小于等于(<=)","等于"就是为了实现: // 如果两元素前一规则(如: 年龄)排序相等,就按下一规则(如: 身高)排序 // 如果 "前一元素 <= 后一元素" ,返回"真",返回"假"! return (((Person) Prev)._age <= ((Person) Next)._age); } public static bool PrevIsHigherThanNext(Object Prev, Object Next) { return(((Person) Prev)._height <= ((Person) Next)._height); } public static bool PrevIsHeavierThanNext(Object Prev, Object Next) { return(((Person) Prev)._weight <= ((Person) Next)._weight); }} // "排序功能(工具)类"class Sorter{ // 声明委托 public delegate bool CompareOp(object X, object Y); //本排序的基本算法就是冒泡法最常见简单易懂,属于"交换"排序法的一种! public static void BubbleSort(object[] A, CompareOp[] MoreThanMethod) //MoreThanMethod 就是排序的字段顺序 { for (int k = 0; k < MoreThanMethod.Length ; k ++) // 遍历委托数组 { for (int i = 0 ; i < A.Length ; i ++) // 冒泡法外层循环 { for (int j = i + 1 ; j < A.Length ; j ++) // 冒泡法内层循环 { bool b = true; for (int m = 0; m <= k ; m ++) { // 如果两元素"前一规则(如: 年龄)"值相等,就按下一规则(如: 身高)比较排序 b = b && MoreThanMethod[m](A[j],A[i]); } if (b) //冒泡法交换元素的条件 { // 冒泡法交换元素 object o = A[i]; A[i] = A[j]; A[j] = o; } } } } }} // 好了就讲到这里了!,有兴趣的读者可以改用别的排序算法,期待在评论回复中"貂尾续狗"!