C#集合

一、 集合概述

  没有掌握集合的知识之前,我们通常都是用数组来存储元素。数组有一个很明显的特点就是,长度是固定的。假设,用数组存储一组员工信息,显然公司的员工数量是有流动性的,如果来了新员工,那么以现有的知识来思考,这个数组只能重新定义。能否建立一个动态的 “数组”,使我们可以对其进行动态的操作呢?下面就引入集合,来解决这个问题。


 二、ArrayList

 ArrayList属于非泛型集合,现在大多数情况用的很少了。文章里会首先介绍非泛型集合,是因为引出泛型集合,就像通过数组引出集合的概念一样。

ArrayList可能会介绍的详细一点,这都是为了后面的内容做铺垫。

 

1.简介

ArrayList非常类似于数组,可以填补数组的不足,进行元素的动态维护。数组的长度是固定的,而ArrayList的容量可以根据需要自动扩充,它的索引会根据程序的扩展而重新分配和调整。

ArrayList是可以动态维护的,因此在定义的时候可以指定容量,也可以不指定容量。

如图:

 

2.给ArrayList添加数据

 a.通过Add()方法添加元素

 Add()方法是将元素添加到集合结尾处,返回一个int类型,用于返回所添加元素的索引。

重点:如果Add()添加的元素是值类型,这些元素都会装箱处理转换为Object引用类型。因此ArrayList中所有的元素都是引用类型。

 

b.通过集合初始化器构造集合

 

 

3.存取ArrayList中的单个元素

 ArrayList获取一个元素的方法和数组是一样的,也是通过索引来访问。需要注意的是,由于元素添加时都会被转换为object类型,所以在访问元素的时候必须把他们转换成原来的数据类型。

 

 

4.删除ArrayList中的元素

4.1.RemoveAt()根据索引删除指定元素。

使用索引删除元素还是存在一定的风险:

运行后,发现系统异常,因为ArrayList的索引会自动分配和调整,在上图注意事项1的集合中添加了三个元素,删除第一个元素后,索引为“2”的第三个元素就不存在了,长度动态的发生了变化,所以再删除索引为“2”的元素就会发生错误。如果存在索引为“2”的元素,那么删除之前和删除之后是两个不同的对象,这时候会导致数据不对。因此使用索引删除元素还是存在一定的风险的。

 

4.2.Remove()指定对象删除。

4.3.Clear()删除集合所有元素。


 

三、Hashtable

对于ArrayList集合我们通常会使用索引访问操作元素,但是这样的话就存在一个问题,使用这种方式必须知道要操作的索引是多少。

Hashtable可以针对这种情况解决问题,它为每个元素都取了一个有意义并且唯一的关键字,然后通过关键字来访问元素。

Hashtable,通常称为哈希表,也有人称它为“字典”。使用字典这个名词,是因为其数成非常类似于现实生活中的字典。Hashtable的数据是通过(key)键和值(value)来组织的。

如图:

1.添加元素:

Add(key,value)

 

2.获取Hashtable元素

2.1.和ArrayList不同,访问Hashtable元素时只能使用通过键名来获取具值。

如图:

用索引访问,程序运行时会提示“未将对象引用设置到对象的示例”。

 

2.2.由于添加时值被隐试转换为object类型,所以当从集合中获取元素时要通过类型转换得到指定类型对象。

示例:

 

2.3.删除Hashtable的元素:

通过键(key),使用Remove()方法就可以删除。

 

2.4.遍历Hashtable中的元素

由于Hashtable不能使用索引访问,所以遍历一个Hashtable只能用foreach()方法:

遍历Hashtable中的对象:


四、泛型集合

前面介绍了两种非泛型集合,Hashtable和ArrayList。在实际开发过程中,用的很少了,说明这两个集合也是为了对讲解和学习泛型集合有一个好的铺垫。

非泛型集合对元素的数据类型没有约束性,在添加时数据类型都会被转为Object类型,这意味着集合中可以加入不同的数据类型的数据。那么这样对数据的操作会有什么影响呢?

示例:

在添加的时候没有约束类型,读取的时候也不知道对象的具体的类型,所以在元素数据类型转换的时候就存在了不确定性。有没有什么好的方法限制集合中元素的数据类型呢?下面就来介绍使用泛型集合来保存数据。泛型集合限定了集合中的数据类型。

 

1.泛型集合List<T>

1.1.语法:List<T> 对象名 = new List<T>();

“<T>”需要指定一个数据类型,将T替换换指定数据类型后就可以对集合中的元素的数据类型进行约束。

 

1.2.泛型集合List<T>添加、获取、删除元素以及遍历的方法和ArrayList的用法都是类似的。但是List<T>在遍历访问元素时无需做类型转换。

示例:

 

1.3.List<T>与ArrayList的区别

 

2.泛型集合Dictionary<K,V>

Dictionary<K,V>集合类似于前面所讲的Hashtable,也是通过Key/value(键/值)对元素保存的。

它具有泛型的全部特性,编译时检查类型约束,获取元素时只能通过key而不能通过索引,并且获取元素时无需类型转换。

 

2.1.语法:

Dictionary<K,V> 对项目 = new Dictionary<K,V>();

说明:K表示集合中指定Key的类型,V表示Value的类型。他们的含义和List<T>是相同的。

 

2.2.Dictionary<K,V>集合的常用(添加、删、获取)操作方法和Hashtable是一样的,在这里不详细介绍。

示例:

 

2.3.遍历Dictionary<K,V>集合:

KeyValuePair<Tkey,Tvalue>是一个泛型结构,定义可设置或者检索的键/值对。详细内容可以查阅MSDN。

 

2.4.Dictionary<K,V>和Hashtable的对比:


 

 

总结:本文只是对集合做了基础和细节的介绍,集合在开发中通常用来存储对象,而在实际的开发中还要结合实际功能深入去学习怎么去运用才是关键。

 

 

 
posted @ 2018-05-18 10:03  姜承轩  阅读(1329)  评论(2编辑  收藏  举报