一.古典集合方式

  在C#2.0的时候集合主要通过两种方式实现:

  1.使用ArrayList实现

  新建ArrayList,然后将所有对象放入该数组中,简单直接,但缺点是该数组什么类型的元素都能接收,在实际使用时对编程人员产生很多困扰。

  2.使用自定义集合类

  比较常见的做法是从CollectionBase抽象类继承一个自定义类,通过对IList对象进行封装实现强类型集合。这种方式要求为每种集合类型写一个相应的自定义类,工作量较大。

而泛型集合的出现较好的解决了上述问题,只需一行代码便能创建指定类型的集合。

二.泛型简介

  泛型是C# 2.0中的新增元素(C++中称为模板),主要用于解决一系列类似的问题。这种机制允许将类名作为参数传递给泛型类型,并生成相应的对象。

  将泛型(包括类、接口、方法、委托等)看作模板可能更好理解,模板中的变体部分将被作为参数传进来的类名称所代替,从而得到一个新的类型定义。

  泛型是一个比较大的话题,在此不作详细解析,有兴趣者可以查阅相关资料。

三.泛型集合的优点

  1.自动封/拆箱

  2.代码简洁

  3.针对对象明确

四.泛型发展

  a.在最初的时候C#2.0版本,对ArrayList的应用很多,但该类集合什么类型的元素都能接收,有很大缺点。如下:

 ArrayList data = new ArrayList();
data.Add("alphabet");//string 类型
data.Add();//int 类型
data.Add(5.5);//double 类型
data.Add(true);//bool类型

  b.另一种是使用自定义集合方式

  新建个类Person

  

 class Person
{
public int Age;
public string Name;
public Person() { }
public Person(int age, string name) {
Age = age;
Name = name;
}
public override string ToString()
{
return string.Format("Name:{0},Age:{1}",Name,Age);
}
}

  然后建立Rerson的集合

  

 class PersonCollection:IEnumerable
{
private ArrayList arPeople = new ArrayList(); public PersonCollection() { } public Person GetPerson(int s)
{
return (Person)arPeople[s];
} public void AddPerson(Person p) {
arPeople.Add(p);
} public void ClearPerson() {
arPeople.Clear();
} public int Count {
get { return arPeople.Count; }
} IEnumerator IEnumerable.GetEnumerator() {
return arPeople.GetEnumerator();
}
}

  这个就是自定义集合,只接受Person类型的数据。

使用时如下:

  

            PersonCollection mypeople = new PersonCollection();
mypeople.AddPerson(new Person(, "Tom"));
mypeople.AddPerson(new Person(, "Bom"));
mypeople.AddPerson(new Person(, "Com"));
mypeople.AddPerson(new Person(, "Dom"));
mypeople.AddPerson(new Person(, "Wom")); mypeople.AddPerson(int );//添加其他类型的数据都会报错

  该自定义集合实现了编程人员所需要的要求,但编制过程中代码麻烦,难于管理,应用起来非常麻烦。

c.泛型使用

  泛型主要利用System.Collections.Generic命名空间下面的List泛型类创建集合,语法如下:

  List<T> ListOfT = new List<T>();

  其中的"T"就是所要使用的类型,既可以是简单类型,如string、int,也可以是用户自定义类型。

  举个例子:

            List<Person> myPerson = new List<Person>();
myPerson.Add(new Person(, "Tim"));
myPerson.Add(new Person(, "Bim"));
myPerson.Add(new Person(, "Cim"));
myPerson.Add(new Person(, "Dim"));
myPerson.Add(new Person(, "Wim"));

  该集合myPerson只接受Person类型的数据。可以看到,泛型集合大大简化了集合的实现代码,通过它,可以轻松创建指定类型的集合。

五.泛型方法

  这个没有什么好说的,和泛型集合差不多含义。

  

     static void Swap<T>(ref  T a,ref T b) {
T temp;
temp = a;
a = b;
b = temp;
}

六.泛型类

  

 class GenericityPerson<T>
{ }

在使用时为了构建更类型安全的容器,会对传入类型参数进行强制约束

泛型约束    
 where T struct 该类型参数<T>中必须在其继承链中必须有System.ValueType值类型
 where T class <T>必须是引用类型
 where T new() <T>必须有一个默认的函数,注意在有多个约束的类型上,此约束必须列在末尾
 where T NameOfBaseClass <T>派生于必须NameOfBaseClass指定的类
 where T NameOfInterface <T>派生于必须NameOfInterface指定的接口,多接口必须用逗号隔开

实例如下

 //GenericityPerson派生自Object,包含的子项必须有一个默认的构造函数
class GenericityPerson<T> where T:new()
{ }
//GenericityPerson派生自Object,包含的子项必须实现IDrawable接口并有默认的构造函数
class GenericityPerson<T> where T :class,IDrawable, new()
{ }
//GenericityPerson派生自Person并实现了IDrawable接口,同时包含的子项必须是结构
class GenericityPerson<T> where T : Person,IDrawable where T:struct
{ }
//<K>必须有一个默认的构造函数,同时<T>必须实现泛型IComparable接口
class GenericityPerson<K,T> where K : new()
where T:IComparable<T>
{ }

七.示例下载

C# 集合与泛型的更多相关文章

  1. Java集合之泛型的使用

    Java集合之泛型的使用 泛型提供了一种轻便灵活的数据操作,数据的安全性相对提高. 泛型提供了对列表元素的约束条件,比如ArrayList有序链表,可存储任意类型的元素. 此处构建一个ArrayLis ...

  2. C#非泛型集合和泛型集合的超级详解

    C# 泛型集合之非泛型集合类与泛型集合类的对应: ArrayList对应List HashTable对应Dictionary Queue对应Queue Stack对应Stack SortedList对 ...

  3. Java集合与泛型中的几个陷阱,你掉进了几个?

    下面我总结了集合.泛型.数组转集合等一些常见的陷进,认真看完,相信你绝对有所收获. 1.List ,List<?> 与 List<Object> 有区别吗? 说实话,我敢保证很 ...

  4. Java集合与泛型中的陷阱

    List,List<Object>区别 List<Integer> t1 = new ArrayList<>(); // 编译通过 List t2 = t1; // ...

  5. C#集合与泛型集合

    看到这个标题,大家应该就知道有泛型集合,就有非泛型集合 既然都是集合,咱们今儿就简单的来对比讲解下 需要记住的不算太多,理解记忆.理解记忆 2017-11-0411:39:09 C# 泛型集合之非泛型 ...

  6. Java_集合与泛型

    Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据.在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都是 ...

  7. .NET基础 (09)常用集合和泛型

    常用集合和泛型1 int[]是引用类型还是值类型2 数组之间如何进行转换3 解释泛型的基本原理4 什么是泛型的主要约束和次要约束 常用集合和泛型1 int[]是引用类型还是值类型 数组类型是一族类型, ...

  8. Java 集合和泛型

    一.集合(Collections) Java使用集合来组织和管理对象. 1.Java的集合类 集合类主要负责保存.盛装和管理对象,因此集合类也被称为容器类. 集合类分为Set.List.Map和Que ...

  9. Java基础之集合与泛型

    话不多说,直接上图 1.Collection集合小结 注意: 凡是使用哈希表保存对象的容器,保存的对象在容器中都是唯一的,唯一性是通过被保存对象的hashCode和equals方法共同确定: 凡是使用 ...

随机推荐

  1. Bellovin_树状数组

    Problem Description Peter has a sequence a1,a2,...,an and he define a function on the sequence -- F( ...

  2. 12-4mysql 查询

    简单查询select * from 表名; 注意:*代表所有); 查询指定列 select 列名,列名 from 表名 修改结果集的列名select 列名 as'',列名 as'' from 表名 条 ...

  3. [转]使用 C 编写 Lua 模块

    Lua 作为一种小巧的语言,一般都是嵌入到 C/C++ 中作为扩展语言,但是也可以作为独立的脚本语言使用,并且可以使用 C/C++ 编写扩展模块.在参考资料 [1] 中有怎样用 C/C++ 编写模块的 ...

  4. RBL开发笔记三

    2014-08-26 20:06:24 今天就是在开发这个EPOLL来处理网络事件 封装较为健壮的EPOLL模型来处理基本的网络IO 1) 超时这个主题先没有弄 在开发EPOLL包括select/po ...

  5. 第一次装TFS的曲折经历

    公司服务器之前TFS没装上,用的svn,实在忍受不了了,作为一个.net程序员怎么能用svn的,说动手就动手. 服务器的数据库是 SqlServer2008R2 本来想装TFS2013,后来试了一下, ...

  6. 应用aspose.word破解版实现word转pdf

    import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import java.io.File; import java ...

  7. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  8. mactype支持qq浏览器

    win7上使用mactype之后qq浏览器网页显示的字体不清晰,颜色也比较浅.解决方法: 1. 再qq浏览器地址栏中输入:qqbrowser://flags 2.在设置中启用DirectWrite高清 ...

  9. ASP.NET中数据邦定效率问题的一点看法 - 转载(自由的天空)

    在 做Asp.NET开发的时候经常用到DataList.Repeater等,用这些控件的时候经常用到数据邦定,很多程序员都是按照MS提供的方 法<%#DataBinder.Eval(Contai ...

  10. 论文笔记之:Generative Adversarial Text to Image Synthesis

    Generative Adversarial Text to Image Synthesis ICML 2016  摘要:本文将文本和图像练习起来,根据文本生成图像,结合 CNN 和 GAN 来有效的 ...