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


原文地址:https://www.cnblogs.com/hopping/p/12470284.html