C# 集合类
集合类:
个人感觉和数据结构有共通之处,都是对数据集合的整合,方便数据的管理和操作。
可以使用集合来维护对象组,与数组(Array)不同,集合可以包含更高级的功能,如对包含对象的访问,搜索,排序。数组的大小是固定的,数组元素要事先声明元素类型,而集合元素类型是object;数组需要通过整数下标来访问数组元素,而集合并不需要,如队列和栈;数组可读可写但不能声明只读,而集合可以可以用ReadOnly方法声明只读。
System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、栈、哈希表和字典)的集合。
1.ArrayList(数组列表)
ArrayList可以储存任何类型的元素,相当于List<Object>,其容量是可变的。
常用的操作方法有:
名称 |
作用 |
Add() |
向列表中添加一个元素 |
Remove(a) |
移除列表中的一个值为a元素 |
RemoveAt(int i) |
移除列表中索引值为i的元素 |
Reverse() |
反转数组元素 |
Sort() |
以从小到大的顺序排列数组元素 |
Clone() |
复制一个数组 |
1 static void Main(string[] args) 2 { 3 ArrayList a = new ArrayList(); 4 a.Add(100);//单个添加 5 foreach (int number in new int[6] { 6, 3, 7, 4, 3, 8 }) 6 { 7 a.Add(number);//集体添加方法一 8 } 9 int[] number2 = new int[2] { 14, 16 }; 10 a.AddRange(number2);//集体添加方法二 11 a.Remove(3);//移除值为3的 12 a.RemoveAt(0);//移除第1个 13 ArrayList a2 = new ArrayList(a.GetRange(1, 3));//新ArrayList只取旧ArrayList一部份 14 15 Console.WriteLine("遍历方法一:"); 16 foreach (int i in a)//不要强制转换 17 { 18 Console.WriteLine(i);//遍历方法一 19 } 20 Console.WriteLine("遍历方法二:"); 21 for (int i = 0; i < a2.Count; i++)//数组是length 22 { 23 int number = (int)a2[i];//一定要强制转换 24 Console.WriteLine(number);//遍历方法二 25 } 26 Console.ReadKey(); 27 }
因为ArrayList元素类型为object类,赋值给number需要强制转换成int类型,不然会报错。
输出序列为:6 7 4 3 8 14 16 7 4 3
2.Queue(队列)
是一种对象的先进先出的集合。Enqueue()方法入队列,Dequeue()方法出队列。
static void Main(string[] args) { Queue qu = new Queue(); Queue qu2 = new Queue(); foreach (int i in new int[4] { 1, 2, 3, 4 }) { qu.Enqueue(i);//入队 } foreach (int i in qu) { Console.WriteLine(i);//遍历 } qu.Dequeue();//出队 qu.Dequeue();//出队 qu.Enqueue(5);//入队 Console.WriteLine("Dequeue"); foreach (int i in qu) { Console.WriteLine(i); } Console.ReadKey(); }
输出顺序为1 2 3 4 Dequeue3 4 5.
3.Stack(栈)
和Queue一样是一种线性的集合,不过与队列不同,Stack(栈)是后进先出。
主要通过Push方法入栈,Pop方法出栈。
4.HashTable(哈希表)
Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找同时,key是区分大小写;
哈希表主要的操作有:
HashtableObject.Add(key,value);//在哈希表中添加一个key/value键值对 HashtableObject.Remove(key); //在哈希表中去除某个key/value键值对 HashtableObject.Clear();//从哈希表中移除所有元素 HashtableObject.Contains(key);//判断哈希表是否包含特定键key
vlaue用于存储对应于key的值。每个元素都是一个存储在DictionaryEntry对象中的键值对。键不能为空引用,但值可以。当把某个元素添加到HashTable时,将根据键的哈希代码将元素放入存储桶中。该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这就大大减少为查找一个元素所需的键比较的次数。
1 public static void Main() 2 { 3 Hashtable ht = new Hashtable(); //创建一个Hashtable实例 4 ht.Add("E", "e");//添加key/value键值对 5 ht.Add("A", "a"); 6 ht.Add("C", "c"); 7 ht.Add("B", "b"); 8 string s = (string)ht["A"]; 9 if (ht.Contains("E")) //判断哈希表是否包含特定键,其返回值为true或false 10 Console.WriteLine("the E key:exist"); 11 ht.Remove("C");//移除一个key/value键值 对 12 Console.WriteLine(ht["A"]);//此处输出a 13 ht.Clear();//移除所有元素 14 Console.WriteLine(ht["A"]); //此处将不会有任何输出 15 16 Console.ReadKey(); 17 }
HashTable的加载因子确定元素与存储桶的最大比率。加载因子越小,平均查找速度越快,但消耗的内存也增加。默认的加载因子1.0通常提供速度与大小之间的最佳平衡。当创建Hashtable时,也可以指定其他加载因子。当向HashTable中添加元素时,HashTable的实际加载因子将增加。当实际加载因子达到指定的加载因子时,HashTable中存储桶的数目自动增加到大于当前HashTable存储桶两倍的最小质数。