集合
集合简单的说就是数组的升级版。他可以动态的对集合的长度(也就是集合内最大元素的个数)进行定义和维护!
1. ArrayLsit(数组列表)
ArrayLsit:非常类似于数组,也有人称他为数组表,ArrayLsit可以动态维护。
数组(Array):容量是固定的
ArrayLsitt:容量可以根据需要自动扩充,他的所以会根据程序的扩展而重新分配和台调整。提供一系列的方法对其中的元素进行访问,增加,和删除。
ArrayLsit:中存储的数据称为元素,ArrayLsit是元素的容量(默认值default(0)),通过索引访问元素。索引0开始
- ArrayLsit在System.Collections命名空间,这个命名空间包含接口和类,这些接口和类定义各种对象(列表,队列,位数组,哈希表和字典)的集合。
- ArrayLsit属于集合的一种,使用之前一定导入命名空。
式列:
using System.Collections;
//创建为0的ArrayList 对象
ArrayList list1 = new ArrayList();
//创建为5的ArrayList 对象
ArrayList list2 = new ArrayList(5);
ArrayLsit属性和方法
- 属性(Count):获取ArrayLsit中的元素书。
- 方法 Add(Object value):将对象添加到结尾处。【返回值int】
⇒参数:如果参数是值类型,这些元素都会装箱处理转换为Object引用类型,然后保存,因此ArrayLsit中的所有元素都是对象的引用。 - 方法 RemoveAt(int index):移除ArrayLsit指定索引元素。【返回值void】
- 方法 Remove(Object value):移除ArrayLsit特定对象。【返回值void】
- 方法 Clean():ArrayLsit移除所有元素。
集合初始化器构造集合
集合初始化器是C#3.0语言的新特性之一,一个集合初始化器由一系列的元素初始化器构成,包围在{ 和 }之间,用逗号分割。
存放ArrayList中的单个元素
ArrayList获取一个元素的方法和数组一样,也是通过索引(index)来访问
注意:
由于给ArrayList添加元素都会被转为Object型,所以访问这些元素的时候必须把他们转回原来的数据类型
遍历ArrayList中的元素
//for循环方式遍历
for (int i = 0; i < list3.Count; i++)
{
SE s = (SE)list2[i];
Console.WriteLine(s.SayHi());
}
//foreach方式遍历
foreach (object obj in list3)
{
SE s = (SE)obj;
Console.WriteLine(s.SayHi());
}
删除ArrayList中的元素
Remove()和RemoveAt()方法只能删除一个元素。Clear()方法
常见错误1
在这里插入代码片
//添加元素
list1.Add(jack);
list1.Add(joe);
list1.Add(ema);
//删除元素
list1.RemoveAt(0);
list1.RemoveAt(1);
list1.RemoveAt(2);
//因为ArrayList索引会自动分配和调整删除前两个后,索引就没有2这个索引了。
二.Hashtable(哈希表)
-
在ArrayList中我们可以通过索引访问集合中的元素,但是当集合内的元素索引频繁变化时要找出每个元素的位置(索引)就变得非常麻烦你了,
-
C#提供了一种叫HashTable的数据结构,通常称他为哈希表也有人称他为“字典”,给它起字典这个名字是因为它和字典非常类似,都是通过一个单词查找出有关此单词的更多信息,HashTable是通过键(Key)和值(Value)来组织数据的。
-
Hashtable也属于System.Collection命名空间,他的每一个元素都是键(key)/值(value)。
Hashtable的常用属性和方法
泛型和泛型集合
通过ArrayList和Hashtable存储的数据类型都会被转换为Object类型,这意味着同一个集合中可以加入不同类型的数据,在遍历集合时就有可能引发强制类型转换错误的问题。而泛型集合是类型安全的,在定义时就先定了集合中的元素类型,下面将详细讲解泛型和泛型集合。
泛型
泛型是C#2.0 中的一个新特性,泛型引入了一个概念:类型参数,通过使用类型参数(T)减少了运行时强制类型转换或装箱拆箱操作的风险,同过泛型可以最大限度的重用代码,保护类型安全及提高性能,它的最常见应用是创建集合类,可以约束集合类中的元素类型。
泛型集合List
在System.Collections.Generic命名空间中定义了去多泛型集合类这些类可以代替上面的ArrayList.
语法:List 对象名 = new List();
“”中的T可以对集合中的元素类型进行约束,T表名集合管理的元素类型。
List和ArrayList的区别
不同点
- List对保存的元素类型做约束,ArrayList可以保存任何类型的元素
- list保存值类型元素不会进行装箱拆箱操作而ArrayList会
相同点 - 通过索引访问集合中的元素
- 添加元素方法相同
- 删除元素方法相同
泛型集合Dictionary<K,V>
泛型集合Dictionary可以代替上面的HashTable
定义一个泛型集合Dictionary<K,V>的语法
Dictionary<K,V> 集合名称=new Dictionary<K,V>();
在”<K,V>”中K表示集合中Key的类型,V表示Value的类型,他们的含义和Hashtable<K,V>是相同的
- Dictionary<K,V>对保存的元素类型做约束,HashTablet可以保存任何类型的元素
- Dictionary<K,V>保存值类型元素不会进行装箱拆箱操作而HashTablet会
Dictionary<K,V>和Hashtable的区别
不同点 - Dictionary<K,V>对保存的元素类型做约束,Hashtable可以保存任何类型的元素
- Dictionary<K,V>保存值类型元素不会进行装箱拆箱操作而Hashtable会
相同点、 - 通过Key获取value
- 添加元素方法相同
- 删除元素方法相同
- 遍历方法相同
泛型类
在集合中使用泛型只是泛型多种应用的一种,在类、方法等方面已有泛型的应用
泛型类的语法如下:
public class 类名<T>
{
//....
}
T指类型参数,代表具体的数据类型,可以是值类型也可以是引用类型
泛型的优点
- 性能高,普通集合的数据需要装箱和拆箱的操作,而泛型无需类型的转化操作
- 类型安全。泛型集合对他所存储的对象进行类型的约束,不是他所允许存储的类型是无法添加到泛型结合中的。
- 实现代码的重用,泛型就相当于模板,由于他支持任意长度的数据类型开发人员不必要为每种特定的数据类型编写一套方法,所以他具有极大的可重用性,泛型编程是未来的主流技术之一