• [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)


  • 相关阅读:
    time fly
    小论文初稿终于完成
    leetcode之Length of Last Word
    static关键字
    参数传递
    this关键字
    面向对象有三大特征
    空指针异常
    变量按数据类型分为
    构造方法
  • 原文地址:https://www.cnblogs.com/hopping/p/12470284.html
Copyright © 2020-2023  润新知