zoukankan      html  css  js  c++  java
  • [C#] 利用泛型,委托 自定义Sort排序规则

      Target:利用泛型,委托 自定义Sort排序规则

    已有类Vector,要对很多的Vector实例自定义排序规则。

    思路,定义一个类Vectors,继承List<Vector>这样就有了一个Vector类型的集合Vectors。这个Vectors还有很多的List<Vector>的方法。

    实现List<T> 中的Sort()方法。

    public class Vector
    {
    /*类定义*/
    }
    public class Vectors : List<Vector>
    {
    /* 类定义*/
    }
    public static class VectorDelegates
    {
            public static int Compare(Vector x, Vector y) {
            /*方法定义*/
            }
    }
    
    Vectors route = new Vectors();
    Comparison<Vector> sorter = new Comparison<Vector>(VectorDelegates.Compare);
    route.Sort(sorter);
    

     以上代码省略具体的实现。

    1. 首先,.Net Framework 中有很多模板。原来如果希望某个类有某些功能,因为通用的关系,需要继承很多的接口。模板类,就是具有固定的方法、属性的一个模板。

    2. 以List<T> 为例:

      它里面有个public void Sort(Comparison<T> comparison); 方法
      其中的的参数Comparison<T>是委托。
      让我们来看看他的原型:
        namespace System
        {
            public delegate int Comparison<in T>(T x, T y);
        }

    3. 现在我们要自定义这个Sort方法,在我们调用 route.Sort的时候,可以按照我们要求的方式排序。
        为了实现自定义的Sort,我需要去传递一个函数委托,大概的形式是这样的:
        <List<T>的实例的名字>.Sort(Comparison<T> 的委托)

    4. 那么就涉及到函数委托怎么写:
        Comparison<T> sorter= new Comparison<T>(被委托的函数名)
        要注意,是函数名,不是函数声明也不是调用!

    5. 那么什么样的函数可以匹配给委托呢。返回值和参数相同。
        观察这个
        public delegate int Comparison<in T>(T x, T y);,他的返回值是int, 接受两个T类型的参数。那么我们也要定义一个这样的函数。假定,T是Vector类型
        public int int Compare(Vector x, Vector y)
        {
        /* 自定义*/
        }

    于是我们可以在静态类VectorDelegates定义一个静态方法Compare,用这个方法创建一个sorter的委托。
    Comparison<Vector> sorter = new Comparison<Vector>(VectorDelegates.Compare);

    最后达到自定义排序规则的目的。
    route.Sort(sorter); //route 是public class Vectors : List<Vector> 的一个实例。

    6.上面的语句也可以简化为:

    route.Sort(VectorDelegates.Compare);
    Sort的参数是一个实例,上面的方式是隐式创建的这个类的实例。对VectorDelegates.Compare()的引用没有括号,称为方法组(method group)


  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/hopping/p/12470284.html
Copyright © 2011-2022 走看看