一、C#集合简介
集合与数组比较类似,都用于存放一组值,但集合中提供了特定的方法能直接操作集合中的
数据,并提供了不同的集合类来实现特定的功能。
集合简单的说就是数组的升级版。他可以动态的对集合的长度(也就是集合内最大元素的个
数)进行定义和维护!
所有集合类或与集合相关的接口命名空间都是 System.Collection。
在该命名空间中提供的常用接口如下表所示:
接口名称 |
作用 |
IEnumerable |
用于迭代集合中的项,该接口是一种声明式的接口 |
IEnumerator |
用于迭代集合中的项,该接口是一种实现式的接口 |
ICollection |
.NET 提供的标准集合接口,所有的集合类都会直接或间接地实现这个接口 |
IList |
继承自 IEnumerable 和 ICollection 接口,用于提供集合的项列表,并允许访问、 查找集合中的项 |
IDictionary |
继承自 IEnumerable 和 ICollection 接口,与 IList 接口提供的功能类似,但集 合 中的项是以键值对的形式存取的 |
IDictionaryEnumerator |
用于迭代 IDictionary 接口类型的集合 |
针对上表中的接口有一些常用的接口实现类,如下表所示:
类名称 |
实现接口 |
特点 |
ArrayList |
ICollection、IList、IEnumerable、ICloneable |
集合中元素的个数是可变的,提供添加、删除等 方法 |
Queue |
ICollection、IEnumerable、ICloneable |
集合实现了先进先出的机制,即元素将在集合的 尾部添加、在集合的头部移除 |
Stack |
ICollection、IEnumerable、ICloneable |
集合实现了先进后出的机制,即元素将在集合的 尾部添加、在集合的尾部移除 |
Hashtable |
IDictionary、ICollection、IEnumerable、 ICloneable 等接口 |
集合中的元素是以键值对的形式存放的,是 DictionaryEntry 类型的 |
SortedList |
IDictionary、ICollection、IEnumerable、 ICloneable 等接口 |
与 Hashtable 集合类似,集合中的元素以键值对 的形式存放,不同的是该集合会按照 key 值自动 对集合中的元素排序 |
二、动态数组
C# ArrayList 类(动态数组)是一个最常用的集合类,与数组的操作方法也是最类似的。
ArrayList 代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。
但是,与数组不同的是,ArrayList 可以使用索引在指定的位置添加和移除项目,动态数组
会自动重新调整它的大小。
同时 ArrayList 也允许在列表中进行动态内存分配、增加、搜索、排序各项。
创建 ArrayList 类的对象需要使用该类的构造方法,如下表所示:
构造方法 |
作用 |
ArrayList() |
创建 ArrayList 的实例,集合的容量是默认初始容量 |
ArrayList(ICollection c) |
创建 ArrayList 的实例,该实例包含从指定实例中复制的元素,并且初始容量 与复制的元素个数相同 |
ArrayList(int capacity) |
创建 ArrayList 的实例,并设置其初始容量 |
构造方法的使用:
1 ArrayList listl=new ArrayList();
2 ArrayList list2=new ArrayList(listl);
3 ArrayList list3=new ArrayList(20);
在 C# 语言中提供了集合初始化器,允许在创建集合实例时向集合中添加元素,代码如下:
1 ArrayList list4 = new ArrayList(){l,2,3,4};由于在集合中存放的值允许是任意类型,能使用 var 关键字来定义任意类型的变量。
1 foreach(var v in list4)
2 {
3 Console.WriteLine(v);
4 }
ArrayList 类中常用的属性和方法如下表所示:
属性或方法 |
作用 |
int Add(object value) |
向集合中添加 object 类型的元素,返回元素在集合中的下标 |
void AddRange(ICollection c) |
向集合中添加另一个集合 c |
Capacity |
属性,用于获取或设置集合中可以包含的元素个数 |
void Clear() |
从集合中移除所有元素 |
bool Contains(object item) |
判断集合中是否含有 item 元素,若含有该元素则返回 True, 否则返回 |
void CopyTo(Array array) |
从目标数组 array 的第 0 个位置开始,将整个集合中的元素复制到类型兼容 的数组 array 中 |
void CopyTo(Array array,int arraylndex) |
从目标数组 array 的指定索引 arraylndex 处,将整个集合中的元素赋值到类 型兼容的数组 array 中 |
void CopyTo(int index,Array array,int arrayIndex,int count) |
从目标数组 array 的指定索引 arrayindex 处,将集合中从指定索引 index 开 始的 count 个元素复制到类型兼容的数组 array 中 |
Count |
属性,用于获取集合中实际含有的元素个数 |
int IndexOf(object value) |
返回 value 值在集合中第一次出现的位置 |
int IndexOf(object value,int startIndex) |
返回 value 值在集合的 startindex 位置开始第一次出现的位置 |
int IndexOf(object value,int startIndex,int count) |
返回 value 值在集合的 startindex 位置开始 count 个元素中第一次出现的位 置 |
int LastIndexOf(object value) |
返回 value 值在集合中最后一次出现的位置 |
int LastIndexOf(object value,int startIndex) |
返回 value 值在集合的 startindex 位置开始最后一次出现的位置 |
int LastIndexOf(object value,int startIndex,int count) |
入元素 value值在集合的 startindex 位置开始 count 个元素中最后一次出现 的位置 |
void Insert(int index,object value) |
返回 value 向集合中的指定索引 index 处插 |
void InsertRange(int index,ICollection c) |
向集合中的指定索引 index 处插入一个集合 |
void Remove(object obj) |
将指定兀素 obj 从集合中移除 |
void RemoveAt(int index) |
移除集合中指定位置 index 处的元素 |
void RemoveRange(int index,int count) |
移除集合中从指定位置 index 处的 count 个元素 |
void Reverse() |
将集合中的元素顺序反转 |
void Reverse(int index,int count) |
将集合中从指定位置 index 处的 count 个元素反转 |
void Sort() |
将集合中的元素排序,默认从小到大排序 |
void Sort(IComparer comparer) |
将集合中的元素按照比较器 comparer 的方式排序 |
void Sort(int index,int count,IComparer comparer) |
将集合中的元素从指定位置 index 处的 count 个元素按照比较器 comparer 的方式排序 |
void TrimToSize() |
将集合的大小设置为集合中元素的实际个数 |
三、队列
Queue (队列) 是常见的数据结构之一,队列是一种先进先出的结构,即元素从队列尾部插
入,从队列的头部移除,类似于日常生活中的站队,先到先得的效果。
集合中的 Queue 类模拟了队列操作,提供了队列中常用的属性和方法。
Queue 类提供了 4 个构造方法,如下表所示:
构造方法 |
作用 |
Queue() |
创建 Queue 的实例,集合的容量是默认初始容量 32 个元素,使用默认的增长因子 |
Queue(ICollection col) |
创建 Queue 的实例,该实例包含从指定实例中复制的元素,并且初始容量与复制的元素 个数、增长因子相同 |
Queue(int capacity) |
创建 Queue 的实例,并设置其指定的元素个数,默认增长因子 |
Queue(int capacity, float growFactor) |
创建 Queue 的实例,并设置其指定的元素个数和增长因子 |
增长因子是指当需要扩大容量时,以当前的容量(capacity)值乘以增长因子
(growFactor)的值来自动增加容量。
Queue类中常用的属性和方法如下表所示:
属性或方法 |
作用 |
Count |
属性,获取 Queue 实例中包含的元素个数 |
void Clear() |
清除 Queue 实例中的元素 |
bool Contains(object obj) |
判断 Queue 实例中是否含有 obj 元素 |
void CopyTo(Array array, int index) |
将 array 数组从指定索引处的元素开始复制到 Queue 实例中 |
object Dequeue() |
移除并返回位于 Queue 实例开始处的对象 |
void Enqueue(object obj) |
将对象添加到 Queue 实例的结尾处 |
object Peek() |
返回位于 Queue 实例开始处的对象但不将其移除 |
object[] ToArray() |
将 Queue 实例中的元素复制到新数组 |
void TrimToSize() |
将容量设置为 Queue 实例中元素的实际数目 |
IEnumerator GetEnumerator() |
返回循环访问 Queue 实例的枚举数 |
举例如下:
class Program
{
static void Main(string[] args)
{
//模拟排队购电影票的操作。
Queue queue = new Queue();
//向队列中加入3为购票人
queue.Enqueue("小张");
queue.Enqueue("小李");
queue.Enqueue("小刘");
Console.WriteLine("购票开始:");
//当队列中没有人时购票结束
while (queue.Count != 0)
{
Console.WriteLine(queue.Dequeue() + "已购票!");
}
Console.WriteLine("购票结束!");
}
}
四、堆栈
Stack (栈)是常见的数据结构之一,栈是一种先进后出的结构,即元素从栈的尾部插入,从
栈的尾部移除,类似于日常生活中搬家的时候装车,先装上车的东西要后拿下来。
集合中的 Stack 类模拟了栈操作,提供了栈中常用的属性和方法。
Stack 类提供了 3 种构造方法,如下表所示:
构造方法 |
作用 |
Stack() |
使用初始容量创建 Stack 的对象 |
Stack(ICollection col) |
创建 Stack 的实例,该实例包含从指定实例中复制的元素,并且初始容量与复制的元素 个数、增长因子相同 |
Stack(int capacity) |
创建 Stack 的实例,并设置其初始容量 |
Stack 类中的常用属性和方法如下表所示:
属性或方法 |
作用 |
Push(object obj) |
向栈中添加元素,也称入栈 |
object Peek() |
用于获取栈顶元素的值,但不移除栈顶元素的值 |
object Pop() |
用于移除栈顶元素的值,并移除栈顶元素 |
Clear() |
从 Stack 中移除所有的元素 |
Contains(object obj) |
判断某个元素是否在 Stack 中 |
object[] ToArray() |
复制 Stack 到一个新的数组中 |
举例如下:
class Program
{
static void Main(string[] args)
{
//模拟快递的存取。
Stack stack = new Stack();7 //向栈中存放元素
stack.Push("1 号快递");
stack.Push("2 号快递");
stack.Push("3 号快递");
stack.Push("4 号快递");
stack.Push("5 号快递");
Console.WriteLine("取出快递:");
//判断栈中是否有元素
while(stack.Count != 0)
{
//取出栈中的元素
Console.WriteLine(stack.Pop());
}
}
}
五、哈希表(散列表)
Hashtable 类实现了 IDictionary 接口,集合中的值都是以键值对的形式存取的。元素顺序
根据key的hash值进行排列。
C# 中的 Hashtable 称为哈希表,也称为散列表,在该集合中使用键值对(key/value)的
形式存放值。
此外,还提供了根据集合中元素的 key 值查找其对应的 value 值的方法。
Hashtable 类提供的构造方法有很多,最常用的是不含参数的构造方法,即通过如下代码
来实例化 Hashtable 类。
1 Hashtable 对象名 = new Hashtable ();
Hashtable 类中常用的属性和方法如下表所示:
属性或方法 |
作用 |
Count |
集合中存放的元素的实际个数 |
void Add(object key,object value) |
向集合中添加元素 |
void Remove(object key) |
根据指定的 key 值移除对应的集合元素 |
void Clear() |
清空集合 |
ContainsKey (object key) |
判断集合中是否包含指定 key 值的元素 |
ContainsValue(object value) |
判断集合中是否包含指定 value 值的元素 |
举例如下:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Hashtable ht = new Hashtable();
6 ht.Add(1, "计算机基础");
7 ht.Add(2, "C#高级编程");
8 ht.Add(3, "数据库应用");
9 Console.WriteLine("请输入图书编号");
10 int id = int.Parse(Console.ReadLine());
11 bool flag = ht.ContainsKey(id);
12 if (flag)
13 {
14 Console.WriteLine("您查找的图书名称为:{0}", ht[id].ToString());
15 }
16 else
17 {
18 Console.WriteLine("您查找的图书编号不存在!");
19 }
20 Console.WriteLine("所有的图书信息如下:");
21 foreach(DictionaryEntry d in ht)
22 {
23 int key = (int)d.Key;
24 string value = d.Value.ToString();
25 Console.WriteLine("图书编号:{0},图书名称:{1}", key, value);
26 }
27 }
28 }
六、有序列表
SortedList 类实现了 IDictionary 接口 ,集合中的值都是以键值对的形式存取的。C# SortedList 称为有序列表,按照 key 值对集合中的元素排序。
SortedList 类中常用的属性和方法如下表所示:
属性或方法 |
作用 |
Count |
集合中存放的元素的实际个数 |
void Add(object key,object value) |
向集合中添加元素 |
void Remove(object key) |
根据指定的 key 值移除对应的集合元素 |
void Clear() |
清空集合 |
ContainsKey (object key) |
判断集合中是否包含指定 key 值的元素 |
ContainsValue(object value) |
判断集合中是否包含指定 value 值的元素 |