知识大全 应用策略模式为List排序

Posted

篇首语:谨慎和勤奋带来好运。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 应用策略模式为List排序相关的知识,希望对你有一定的参考价值。

应用策略模式为List排序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  编程时遇到排序在平常不过 使用 Net最常见的就是对泛型List<T>进行排序 如果T是简单数据类型排序那么很简单 直接调用List的Sort()方法就可以了 但是如果我们要排的对象复杂了怎么办 我们知道List<T> sort()最后是用快速排序实现 快速排序也好 什么排序都需要知道list中item之间的比较结果 如果是简单的int类型 直接判断即可 对实现了IComparable接口的对象 可以调用其CompareTo()实现item比较大小 下面是一个快速排序的写法

  void Sort<T>(T[] array int left int right IComparer_sly<T> parer) where T : IComparable                    if (left < right)                            T middle = array[(left + right) / ];                int i = left ;                int j = right + ;                while (true)                                    while (array[++i] CompareTo(middle) < ) ;

  while (array[ j] CompareTo(middle) > ) ;

  if (i >= j)                        break;

  T temp = array[i];                    array[i] = array[j];                    array[j] = temp;               

  Sort(array left i parer);                Sort(array j + right parer);                   

  问题

  对于前两种情况固然可以实现排序 但是我们不可能要求所有待排序的对象都实现IComparable接口 就算能够保证每个对象都实现IComparable接口 如果想实现对象内多个字段排序 比如Student对象 有时候想按照姓名排序 有时候是成绩 有时候是年龄 这怎么破

  按照面向对象的思想 要把变化独立出来 封装变化 对于我们排序List<T>时变化的其实就是怎么比较两个对象的大小的算法 如果我们可以把这个算法拿出来 排序就简单了很多 无论什么排序 算法都是由的 我们要封装的部分是怎样比较两个item的大小的算法 为了实现拓展性我们要遵循面向对象设计的另外一个重要原则 针对接口编程 而不是针对实现编程

  编写通用的List<T>排序方法首先定义一个接口 里面有一个比较item大小的方法 在排序的时候作为参数传入 当然是传入它的实现类 有了这个想法 我们可以自己写个List<T>的排序方法

  public interface IComparer_sly<T>        int Compare(T x T y);

  然后为了测试 我们为List<T>加一个包装 写一个自己的Sort方法 内部也用快速排序实现 一直困惑我们的变化部分——比较大小算法 我们把它封转起来 作为参数传入

  using System;using System Collections Generic;

  namespace Test Stategypublic class ListTest<T>            public List<T> list = new List<T>();        public void Sort(IComparer_sly<T> parer)                    T[] array = list ToArray();            int left = ;            int right = array Length ;            QuickSort(array left right parer);            list = new List<T>(array);       

  private void QuickSort<S>(S[] array int left int right IComparer_sly<S> parer)                    if (left < right)                            S middle = array[(left + right) / ];                int i = left ;                int j = right + ;                while (true)                                    while (parer Compare(array[++i] middle) < ) ;

  while (parer Compare(array[ j] middle) > ) ;

  if (i >= j)                        break;

  S temp = array[i];                    array[i] = array[j];                    array[j] = temp;               

  QuickSort(array left i parer);                QuickSort(array j + right parer);                        比如现在我们有个Student 的实体

  public class Student            public Student(int id string name)                    this ID = id;            this Name = name;                public int ID get; set;         public string Name get; set;    

  如果想对这个实体组成的List<T>进行排序 我们只需一个实现 IComparer_sly<Student>的类 StudentComparer 并在内部实现其比较大小方法——Compare() 同时我们可以添加递增还是递减排序的控制

  class StudentComparer : IComparer_sly<Student>            private string expression;        private bool isAscending;        public StudentComparer(string expression bool isAscending)                    this expression = expression;            this isAscending = isAscending;       

  public int Compare(Student x Student y)                    object v = GetValue(x) v = GetValue(y);            if (v is string || v is string)                            string s = ((v == null) ? : v ToString() Trim());                string s = ((v == null) ? : v ToString() Trim());                if (s Length == && s Length == )                    return ;                else if (s Length == )                    return ;                else if (s Length == )                    return ;           

  // 这里就偷懒调用系统方法 不自己实现了 其实就是比较两个任意相同类型数据大小 自己实现比较麻烦            if (!isAscending)                return Comparer Default Compare(v v );            return Comparer Default Compare(v v );       

  private object GetValue(Student stu)                    object v = null;            switch (expression)                            case id :                    v = stu ID;                    break;                case name :                    v = stu Name;                    break;                default:                    v = null;                    break;                        return v;            测试一下好不好使

  static void Main(string[] args)                    ListTest<Student> test = new ListTest<Student>();            for (int i = ; i < ; i++)                            Student stu = new Student(i string Format( N_ +( i)));                test list Add(stu);                        Console WriteLine( 元数据 );            for (int i = ; i < test list Count;i++ )                            Console WriteLine(string Format( ID: Name: test list[i] ID test list[i] Name));           

  Console WriteLine( Name 递增 );            test Sort(new StudentComparer( name true));            for (int i = ; i < test list Count; i++)                            Console WriteLine(string Format( ID: Name: test list[i] ID test list[i] Name));                    看看效果

  

   NET List的sort如何为我们排序用ILSpy反编译可以看到在调用List<T>的sort()方法时内部调用的时 this Sort( this Count null); 然后往里面扒 经过一系列异常处理后会调用 Array Sort<T>(this _items index count parer); this _items是把List内容转换成数组 同样再经历一些列异常处理 调用方法 ArraySortHelper<T> Default Sort(array index length parer); 再往里就和我们上面写的方法大同小异了 只不过微软加了很多异常处理和算法优化

  策略模式看清楚了上面这个例子我们就可以进入正题 说说我们的策略模式了 策略模式定义了一系列的算法 并将每一个算法封装起来 而且使它们还可以相互替换 策略模式让算法独立于使用它的客户而独立变化 (原文 The Strategy Pattern defines a family of algorithms encapsulates each one and makes them interchangeable Strategy lets the algorithm vary independently from clients that use it )

  

  这个模式涉及到三个角色

cha138/Article/program/net/201311/12248

相关参考

知识大全 设计模式之Strategy(策略)

设计模式之Strategy(策略)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Strateg

策略指数的运作模式

策略指数的运作模式由于策略本身是开放型的,因此策略指数的开发过程必然是指数开发人员、资产所有人、投资顾问等参与方互动的结果。目前海外策略指数的开发大致有两种运作模式:1)自上而下。通常是由资产管理公司

知识大全 老生常谈:策略模式

  本来园子里面已经有很多特别好的关于设计模式学习的文章但一般都是概念性的或者都是些简单实例没有用过设计模式的朋友看过之后虽然明白怎么回事了但是对于自己实际项目中何时用设计模式就不太清楚了本人借jil

左侧交易的应用策略

左侧交易的应用策略在理解左侧交易理念时,我们建议投资者不要僵化地执行,而应该灵活把握。首先,运用左侧交易时要密切关注趋势的时间性,因为趋势按照持续的时间长短可划分为短期趋势、中期趋势和长期趋势,在不同

知识大全 Oracle学习应用之数据库性能优化策略

Oracle学习应用之数据库性能优化策略  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据库系

知识大全 如何以表为数据源导入成为List

如何以表为数据源导入成为List  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  假设有表    

多空仓策略的应用

多空仓策略的应用国内由于融券成本较大,并且融券余额紧张,因此目前国内多空仓策略主要是在持有股票多头的时候同时做空股指期货,做到对冲,也可以结合当下市场的判断,调整多头与空头的比率,也可以单独买入股票同

知识大全 C# 中 List 用法

C#中List用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  List类是ArrayList

知识大全 超COOL的LIST样式

超COOL的LIST样式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!     &nbs

知识大全 有财务模式这一概念吗

有财务模式这一概念吗?或者说财务模式有哪些呢?有财务模式这一概念:其内容具体可以分为九大模块1.损益表2.资产负债表3.现金流量表4.现金为王5.利润操控6.财务分析7.360管控8.上市策略9.兼并