zoukankan      html  css  js  c++  java
  • 泛型(Generic)方法(函数,算法)

    例子:

           static void Main(string[] args)
            {
                int[] a1 = { 1, 2, 3, 4, 5 };
                int[] a2 = { 1, 2, 3, 4, 5 };
                double[] a3 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
                double[] a4 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
                var result = Zip(a1, a2);
                Console.WriteLine(string.Join(",", result));
            }
            static int[] Zip(int[] a, int[] b)
            {
                int[] zipped = new int[a.Length + b.Length];
                int ai = 0, bi = 0, zi = 0;
                do
                {
                    if (ai < a.Length) zipped[zi++] = a[ai++];
                    if (bi < b.Length) zipped[zi++] = b[bi++];
                } while (ai < a.Length || bi < b.Length);
                return zipped;
            }
    

    通过泛型方法来实现对不同类型的数组用同一种方法进行操作,如果不适用泛型则方法只能对规定的类型进行修改。

    Zip方法是将两个数组你一个我一个插入到一个新的数组里并且返回。

    这样不会出现成员膨胀(方法膨胀)也不会出现重复逻辑(导致需要修改的时候要每个重载方法都修改)

    如何修改成泛型方法呢?
    我们把Zip类中的int[]全部替换为T[]类型( int ai = 0, bi = 0, zi = 0;这句不含有[]所以不会被替换)
    然后在static int[] Zip(int[] a, int[] b)的Zip后加,表示这是一个泛型方法,类型参数是T。

    static T[] Zip<T>(T[] a, T[] b)
    

    意思是,Zip是一个类型参数是T的泛型方法,它的参数是两个T类型的数组,返回一个T类型的数组

           static void Main(string[] args)
            {
                int[] a1 = { 1, 2, 3, 4, 5 };
                int[] a2 = { 1, 2, 3, 4, 5 };
                double[] a3 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
                double[] a4 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
                var result = Zip(a1, a2);
                Console.WriteLine(string.Join(",", result));
            }
            static T[] Zip<T>(T[] a, T[] b)
            {
                T[] zipped = new T[a.Length + b.Length];
                int ai = 0, bi = 0, zi = 0;
                do
                {
                    if (ai < a.Length) zipped[zi++] = a[ai++];
                    if (bi < b.Length) zipped[zi++] = b[bi++];
                } while (ai < a.Length || bi < b.Length);
                return zipped;
            }
    


    当我们传入a1,a2时,我们并没有特化Zip方法

            var result = Zip(a1, a2);
    

    说明编译器能自动推断出来T的类型,所以我们不用显示去写,这就是泛型方法在调用的时候类型参数的自动推断。

  • 相关阅读:
    C++中Map的使用 (个人简单的对于String的使用)
    具体数学二项式至生成函数章-----致敬Kunth
    C++中String的使用
    C++中Set的使用
    费马小定理,欧拉函数
    数论---同余法则定理
    灵活利用单链表,顺带一提可持久化链表。
    第2章 数字之魅——数字中的技巧
    Mail.Ru Cup 2018 Round 1
    Lyft Level 5 Challenge 2018
  • 原文地址:https://www.cnblogs.com/maomaodesu/p/11653842.html
Copyright © 2011-2022 走看看