C#的集合類型及使用技巧


在日常開發過程中,我們不能避免的要對批量數據處理,這時候就要用到集合。集合總體上分為線性集合和非線性集合。線性集合是指元素具有唯一的前驅和后驅的數據結構類型;非線性集合是指有多個前驅和后驅的數據結構類型,如樹和圖。我們這里主要講常用的線性集合,常用的線性集合有數組、ArrayList、List、Hashtable(哈希表)、Dictionary(字典)、Stack(堆棧集合)、Queue(隊列集合)等。
一、數組
數組是一個存儲相同類型元素的固定大小的順序集合。數組屬於引用類型,它繼承System.Array類,System.Array是所有數組的基類。
1、一維數組
一維數組聲明方式:

//聲明一個長度為5的int類型一維數組
int[] numbers = new int[5];

一維數組的初始化方式有以下三種寫法:

//一維數組的初始化方式
int[] numbers1 = new int[5] {1,2,3,4,5};//指定大小和元素,使用條件是數組大小必須與元素個數相匹配。
int[] numbers2 = new int[] {1,2,3,4,5};//不指定數組大小,因為編譯器會自動統計元素的個數。
int[] numbers3 = { 1, 2, 3, 4, 5 };//這是更簡化的形式,直接使用花括號聲明和初始化數組。

訪問數組元素:
在聲明和初始化數組后,就可以使用索引器訪問其中的元素了,數組只支持有整型參數的索引器。索引器總是以0開頭,表示第一個元素。注意:如果使用錯誤的索引器值(其中不存在對應的元素),就會拋出IndexOutOfRangeExcepation類型的異常。

int[] numbers1 = new int[5] {1,2,3,4,5};
int value1 = numbers1[0];//獲取數組的第一個元素。

如果要循環遍歷數組中的元素,可以使用for循環,也可以使用foreach來遍歷數組中的元素,兩者的區別在於:foreach循環對數組內容進行只讀訪問,所以不能改變任何元素的值,但是for循環可以給數組元素賦值。
2、多維數組
多維數組包含二維數組、三維數組等等。我們這里以二維數組為例。
二維數組聲明方式:

//二維數組的聲明方式,
string[,] names = new string[5, 4];

二維數組初始化方式:

//二維數組的初始化方式
string[,] names1 = { { "a", "b" }, { "c", "d" } };

3、數組的數組
數組的數組聲明方式:

//數組的數組聲明方式
byte[][] scores = new byte[5][];

數組的數組初始化方式:

//數組的數組的初始化方式
int[][] scores1 = { new int[]{1,2},new int[]{1,2,3,4}};

多維數組與數組的數組的差別:多維數組每行長度一致,是固定的;但是數組的數組每行長度是可以不固定。數組在內存中是連續存儲的,所以它的索引速度非常快,但也正因為數組在內存中是連續存儲的,造成數組必須在聲明時指定大小,那么如果聲明時數組長度太長,則導致內存浪費;長度太短又會造成數據溢出錯誤。另外,因為空間連續,插入和刪除元素效率比較低,而且麻煩。


二、集合ArrayList和List
1、ArrayList
ArrayList是System.Collections命名空間中定義的非泛型類型的集合。它用於創建動態數組意味着數組的大小根據程序的要求自動增加或減少,不需要指定ArrayList的大小。因為ArrayList是非泛型類型的集合,所以ArrayList既能存儲相同類型的元素,也能存儲不同類型的元素,故ArrayList不能保證類型安全。
注意:ArrayList的使用需要引入System.Collections命名空間。
ArrayList常用方法:

ArrayList arrayList = new ArrayList();
ArrayList tempArrayList = new ArrayList();
arrayList.Add("abc");//在集合結尾處添加單個元素
arrayList.AddRange(tempArrayList);//在集合結尾處添加指定集合
arrayList.Remove("abc");//移除指定元素(第一個匹配項)
arrayList.RemoveAt(0);//移除指定索引處元素
arrayList.Contains("cd");//判斷指定元素是否存在集合中。
arrayList.Insert(1,"kk");//將元素插入指定索引位置

通過ArrayList的Add()方法,我們不難看出向ArrayList集合中添加元素時是以Object類型添加的,也就是說添加進ArrayList集合的所有元素將轉換成Object類型。如果我們向ArrayList集合添加的元素是值類型的時候,這個時候將涉及到拆箱和裝箱的操作,在我們之前的內容中提到拆箱和裝箱是很消耗內存和cpu資源的。另外,即使我們向ArrayList集合添加的元素是引用類型,那么我們在使用時也需要進行類型轉換,這個過程也是需要耗費時間和資源的。
2、List
List是一種泛型集合,它是由ArrayList發展而來的集合,在保留ArrayList優點的同時也解決了ArrayList對於值類型需要拆箱和裝箱的缺點,並保證類型安全。因此List在聲明時就需要指定類型。
注意:List的使用需要引入System.Collections.Generic命名空間。
List常用方法:

List<string> address = new List<string>();//聲明一個List  
List<string> tempAddress = new List<string>() {"北京","沈陽"};
address.Add("武漢");//在集合結尾處添加單個元素
address.AddRange(tempAddress);//在集合結尾處添加指定集合
address.Remove("沈陽");//移除集合中第一個匹配元素
address.RemoveAt(0);//移除指定索引處元素
address.Insert(1, "湖南");//將元素插入集合指定索引位置    
address.Clear();//移除集合中所有元素
address.Contains("湖南");//判斷某個元素是否存在集合中                     
int number = address.Count;//獲取集合中元素個數
//List還有很多其它方法,這里就不詳細講解。 

通過ArrayList和List的對比,我們在日常開發的過程中,盡量避免使用ArrayList,如果集合的數目固定並且不涉及類型轉換,使用數組效率高,否則使用List。

三、Hashtable和Dictionary
C#中的Hashtable和Dictionary都是以鍵值對形式存儲的集合,哈希表未指定類型,會引發類型安全問題,同時使用時也會進行拆箱和裝箱操作,比較耗費資源;字典指定類型,故保證類型安全,但字典多線程時不是線程安全的類型,必須人為使用lock語句進行保護,這樣效率會大減。哈希表默認是允許單線程寫入,多線程讀取,故是線程安全類型。
哈希表常用方法:

//哈希表未聲明類型,會引發類型安全問題
Hashtable hashtable = new Hashtable();//聲明一個哈希表
hashtable.Add(0,"北京");//添加帶有指定鍵和值的元素
hashtable.Clear();//移除所有元素
hashtable.ContainsKey(0);//判斷哈希表中是否存在指定鍵
hashtable.ContainsValue("北京");//判斷哈希表中是否存在指定值
hashtable.Remove(0);//移除指定鍵的鍵值對   
int hashtableCount = hashtable.Count;//獲取哈希表中鍵值對個數

字典常用方法:

//字典指定數據類型
Dictionary<string, string> dictionary = new Dictionary<string, string>();//聲明一個字典
dictionary.Add("張三","15823504311");//添加帶有指定鍵和值的元素
dictionary.Clear();//移除所有元素
dictionary.ContainsKey("張三");//判斷字典中是否存在指定鍵
dictionary.ContainsValue("15823504311");//判斷字典中是否存在指定值            
dictionary.Remove("張三");//移除指定鍵的鍵值對
int dictionaryCount = dictionary.Count;//獲取字典中鍵值對個數
dictionary.Keys;//獲取字典中鍵的集合
dictionary.Values;//獲取字典中值的集合


四、其它常用集合類型
1、隊列Queue<T>
隊列Queue<T>遵循的是先入先出的模式,它在集合末尾添加元素,在集合的起始位置刪除元素。根據隊列的特點,可以用它來處理並發命令等場景:先讓所有客戶端的命令入隊,然后,由專門的工作線程來執行隊列的命令。在分布式中的消息隊列就是一個典型的隊列
應用實例。
2、棧Stack<T>
棧Stack<T> 遵循的是后入先出的模式,它在集合末尾添加元素,同時也在集合末尾刪除元素。
3、雙向鏈表LinkedList<T>
雙向鏈表LinkedList<T>是一個類型為LinkedListNode的元素對象的集合。當我們覺得在集合中插入和刪除數據很慢時,就可以考慮使用鏈表。雙向鏈表常用方法為AddAfter、AddBefore、AddFirst、AddLast等,雙向鏈表中的每個節點都向前指向Previous節點,向后指向Next節點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM