当前位置: 首页 > news >正文

利用委托实现对象实例按多字段嵌套排序

/*<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

利用"委托"实现对象实例按"多字段嵌套"排序

 

(不知道大家看懂题目了? 功能还是挺实用的!)

本文实现 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;

                    }

                }

            }

        }

    }

}

 

// 好了就讲到这里了!,有兴趣的读者可以改用别的排序算法,期待在评论回复中"貂尾续狗"!

 

转载于:https://www.cnblogs.com/Microshaoft/archive/2004/10/29/2485761.html

相关文章:

  • SQL SERVER中的三种获得自增长ID的方法
  • 自制简易AP柱面定向天线(zz)
  • JScript中的prototype(原型)属性研究(2)
  • 今天最大的收获
  • 树形导航的实现xml
  • 加菲猫语录
  • 如何在Evolution中加密(四)
  • 采用开源软件搭建WebGIS系统(2)最简单的Demo
  • 几种调用WebService的方法
  • [Avalon] Avalon中的Conditional Formatting.
  • 转载:码根码的悲哀
  • [非技术]“西北风”新考:原来是菜和茶!
  • 配置好IIS中的SMTP服务器
  • 印象
  • Android 控件背景颜色处理
  • exports和module.exports
  • HTTP那些事
  • jquery ajax学习笔记
  • laravel5.5 视图共享数据
  • Mysql5.6主从复制
  • PHP 7 修改了什么呢 -- 2
  • SpiderData 2019年2月25日 DApp数据排行榜
  • use Google search engine
  • VuePress 静态网站生成
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 用Python写一份独特的元宵节祝福
  • k8s使用glusterfs实现动态持久化存储
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #etcd#安装时出错
  • #Linux(权限管理)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (一)RocketMQ初步认识
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET MVC之AOP
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .net对接阿里云CSB服务
  • .NET实现之(自动更新)
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET中两种OCR方式对比
  • @EnableAsync和@Async开始异步任务支持
  • @media screen 针对不同移动设备
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [Angular] 笔记 21:@ViewChild
  • [AutoSar NVM] 存储架构
  • [C#]DataTable常用操作总结【转】