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)


  • 相关阅读:
    POJ 1887 Testing the CATCHER
    HDU 3374 String Problem
    HDU 2609 How many
    POJ 1509 Glass Beads
    POJ 1458 Common Subsequence
    POJ 1159 Palindrome
    POJ 1056 IMMEDIATE DECODABILITY
    POJ 3080 Blue Jeans
    POJ 1200 Crazy Search
    软件体系结构的艺术阅读笔记1
  • 原文地址:https://www.cnblogs.com/hopping/p/12470284.html
Copyright © 2011-2022 走看看