例子:

  1. static void Main(string[] args)
  2. {
  3. int[] a1 = { 1, 2, 3, 4, 5 };
  4. int[] a2 = { 1, 2, 3, 4, 5 };
  5. double[] a3 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
  6. double[] a4 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
  7. var result = Zip(a1, a2);
  8. Console.WriteLine(string.Join(",", result));
  9. }
  10. static int[] Zip(int[] a, int[] b)
  11. {
  12. int[] zipped = new int[a.Length + b.Length];
  13. int ai = 0, bi = 0, zi = 0;
  14. do
  15. {
  16. if (ai < a.Length) zipped[zi++] = a[ai++];
  17. if (bi < b.Length) zipped[zi++] = b[bi++];
  18. } while (ai < a.Length || bi < b.Length);
  19. return zipped;
  20. }

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

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

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

如何修改成泛型方法呢?

我们把Zip类中的int[]全部替换为T[]类型( int ai = 0, bi = 0, zi = 0;这句不含有[]所以不会被替换)

然后在static int[] Zip(int[] a, int[] b)的Zip后加,表示这是一个泛型方法,类型参数是T。

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

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

  1. static void Main(string[] args)
  2. {
  3. int[] a1 = { 1, 2, 3, 4, 5 };
  4. int[] a2 = { 1, 2, 3, 4, 5 };
  5. double[] a3 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
  6. double[] a4 = { 1.1, 2.2, 3.3, 4.4, 5.5 };
  7. var result = Zip(a1, a2);
  8. Console.WriteLine(string.Join(",", result));
  9. }
  10. static T[] Zip<T>(T[] a, T[] b)
  11. {
  12. T[] zipped = new T[a.Length + b.Length];
  13. int ai = 0, bi = 0, zi = 0;
  14. do
  15. {
  16. if (ai < a.Length) zipped[zi++] = a[ai++];
  17. if (bi < b.Length) zipped[zi++] = b[bi++];
  18. } while (ai < a.Length || bi < b.Length);
  19. return zipped;
  20. }



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

  1. var result = Zip(a1, a2);

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

泛型(Generic)方法(函数,算法)的更多相关文章

  1. Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口

    Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...

  2. Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)

    一.Comparable接口, Collections类 List的常用算法: sort(List); 排序,如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个 ...

  3. C#泛型(Generic)

    一.什么是泛型 泛型(Generic)是C#语言2.0.通用语言运行时(CLR)2.0..NET Framework2.0推出来的新特性. 泛型为.NET框架引入类型参数(Type Parameter ...

  4. SQL Server 聚合函数算法优化技巧

    Sql server聚合函数在实际工作中应对各种需求使用的还是很广泛的,对于聚合函数的优化自然也就成为了一个重点,一个程序优化的好不好直接决定了这个程序的声明周期.Sql server聚合函数对一组值 ...

  5. 2.C#中泛型在方法Method上的实现

    阅读目录   一:C#中泛型在方法Method上的实现 把Persion类型序列化为XML格式的字符串,把Book类型序列化为XML格式的字符串,但是只写一份代码,而不是public static s ...

  6. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic )     > 泛型的特点         > 解决元素存储的安全性问题         > 解决获取数据元素时,需要类型强转的问题     ...

  7. 谈一谈从 Delphi 2009 之后就支援的重要功能 – 泛型 (Generic)

    前言 在C++的语言基础当中,除了物件导向.事件驱动的概念之外,模版设计(Template)也是非常重要的一环.然而,C++的开发人员能够善用模版设计的并不多.模版设计这个好物,一般还有一个名称,就是 ...

  8. 【严蔚敏】【数据结构题集(C语言版)】1.17 求k阶斐波那契序列的第m项值的函数算法

    已知k阶斐波那契序列的定义为 f(0)=0,f(1)=0,...f(k-2)=0,f(k-1)=1; f(n)=f(n-1)+f(n-2)+...+f(n-k),n=k,k+1,... 试编写求k阶斐 ...

  9. scala(一)方法&函数

    写在前面 众所周知,scala一向宣称自己是面向函数的编程,(java表示不服,我是面向bean的编程!)那什么是函数? 在接触java的时候,有时候用函数来称呼某个method(实在找不出词了),有 ...

  10. JavaWeb_泛型(Generic)

    JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免的就会引发程序的一些安全性问题.例如: ArrayList list = new ArrayList ...

随机推荐

  1. ionic3 多级联动城市选择插件 ion-multi-picker

    1.效果演示 2.npm安装扩展包依赖  ion-multi-picker 组件 npm install ion-multi-picker --save 3.在app.module.ts中导入插件模块 ...

  2. plsql的tns目录配置

    在系统环境变量中设置:TNS_ADMIN = E:\app\client\lenovo\product\12.2.0\client_1\network\admin 如果电脑中将来装了多个oracle的 ...

  3. RemoTing 搭建简单实现

    今天对C# Remoting进行了初步的学习,废话不说... RemotingModel: Talker.cs using System;using System.Collections.Generi ...

  4. mongodb的学习 (2)

    1.条件查询 查询姓名为小明的学生                            db.local.find({name:'小明'});; 查询英语成绩大于90分的同学            ...

  5. Redux DevTools Extension 的使用

    网址  https://github.com/zalmoxisus/redux-devtools-extension 1.const composeEnhancers = window.__REDUX ...

  6. Tomcat免安装版踩坑

    下载解压 从官网下载Tomcat的压缩包解压到硬盘上(这里用的是toncat7),解压之后目录如下(Windows) bin 存放tomcat的一些命令脚本 conf 存放配置文件 lib 存放运行时 ...

  7. 分布式项目spring 配置文件的约束

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  8. java-items

    类名Items package entity; //商品类 public class Items { private int id; // 商品编号 private String name; // 商 ...

  9. thinkphp 常量参考

    预定义常量 预定义常量是指系统内置定义好的常量,不会随着环境的变化而变化,包括: URL_COMMON 普通模式 URL (0) URL_PATHINFO PATHINFO URL (1) URL_R ...

  10. Android中TextView不获取焦点可以实现跑马灯的效果

    之前在网上找了很多关于TextView的跑马灯效果实现的例子,实现起来都存在一些问题,例如一种是完全重画一个跑马灯,还有就是只设置TextView的相关属性使其具有跑马灯的效果,总的来说这两种方法都是 ...