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存储桶两倍的最小质数。

 

posted @ 2015-11-11 17:15  SeeKHit  阅读(1373)  评论(0编辑  收藏  举报