C#集合


一、 集合概述

  沒有掌握集合的知識之前,我們通常都是用數組來存儲元素。數組有一個很明顯的特點就是,長度是固定的。假設,用數組存儲一組員工信息,顯然公司的員工數量是有流動性的,如果來了新員工,那么以現有的知識來思考,這個數組只能重新定義。能否建立一個動態的 “數組”,使我們可以對其進行動態的操作呢?下面就引入集合,來解決這個問題。


 二、ArrayList

 ArrayList屬於非泛型集合,現在大多數情況用的很少了。文章里會首先介紹非泛型集合,是因為引出泛型集合,就像通過數組引出集合的概念一樣。

ArrayList可能會介紹的詳細一點,這都是為了后面的內容做鋪墊。

 

1.簡介

ArrayList非常類似於數組,可以填補數組的不足,進行元素的動態維護。數組的長度是固定的,而ArrayList的容量可以根據需要自動擴充,它的索引會根據程序的擴展而重新分配和調整。

ArrayList是可以動態維護的,因此在定義的時候可以指定容量,也可以不指定容量。

如圖:

 

2.給ArrayList添加數據

 a.通過Add()方法添加元素

 Add()方法是將元素添加到集合結尾處,返回一個int類型,用於返回所添加元素的索引。

重點:如果Add()添加的元素是值類型,這些元素都會裝箱處理轉換為Object引用類型。因此ArrayList中所有的元素都是引用類型。

 

b.通過集合初始化器構造集合

 

 

3.存取ArrayList中的單個元素

 ArrayList獲取一個元素的方法和數組是一樣的,也是通過索引來訪問。需要注意的是,由於元素添加時都會被轉換為object類型,所以在訪問元素的時候必須把他們轉換成原來的數據類型。

 

 

4.刪除ArrayList中的元素

4.1.RemoveAt()根據索引刪除指定元素。

使用索引刪除元素還是存在一定的風險:

運行后,發現系統異常,因為ArrayList的索引會自動分配和調整,在上圖注意事項1的集合中添加了三個元素,刪除第一個元素后,索引為“2”的第三個元素就不存在了,長度動態的發生了變化,所以再刪除索引為“2”的元素就會發生錯誤。如果存在索引為“2”的元素,那么刪除之前和刪除之后是兩個不同的對象,這時候會導致數據不對。因此使用索引刪除元素還是存在一定的風險的。

 

4.2.Remove()指定對象刪除。

4.3.Clear()刪除集合所有元素。


 

三、Hashtable

對於ArrayList集合我們通常會使用索引訪問操作元素,但是這樣的話就存在一個問題,使用這種方式必須知道要操作的索引是多少。

Hashtable可以針對這種情況解決問題,它為每個元素都取了一個有意義並且唯一的關鍵字,然后通過關鍵字來訪問元素。

Hashtable,通常稱為哈希表,也有人稱它為“字典”。使用字典這個名詞,是因為其數成非常類似於現實生活中的字典。Hashtable的數據是通過(key)鍵和值(value)來組織的。

如圖:

1.添加元素:

Add(key,value)

 

2.獲取Hashtable元素

2.1.和ArrayList不同,訪問Hashtable元素時只能使用通過鍵名來獲取具值。

如圖:

用索引訪問,程序運行時會提示“未將對象引用設置到對象的示例”。

 

2.2.由於添加時值被隱試轉換為object類型,所以當從集合中獲取元素時要通過類型轉換得到指定類型對象。

示例:

 

2.3.刪除Hashtable的元素:

通過鍵(key),使用Remove()方法就可以刪除。

 

2.4.遍歷Hashtable中的元素

由於Hashtable不能使用索引訪問,所以遍歷一個Hashtable只能用foreach()方法:

遍歷Hashtable中的對象:


四、泛型集合

前面介紹了兩種非泛型集合,Hashtable和ArrayList。在實際開發過程中,用的很少了,說明這兩個集合也是為了對講解和學習泛型集合有一個好的鋪墊。

非泛型集合對元素的數據類型沒有約束性,在添加時數據類型都會被轉為Object類型,這意味着集合中可以加入不同的數據類型的數據。那么這樣對數據的操作會有什么影響呢?

示例:

在添加的時候沒有約束類型,讀取的時候也不知道對象的具體的類型,所以在元素數據類型轉換的時候就存在了不確定性。有沒有什么好的方法限制集合中元素的數據類型呢?下面就來介紹使用泛型集合來保存數據。泛型集合限定了集合中的數據類型。

 

1.泛型集合List<T>

1.1.語法:List<T> 對象名 = new List<T>();

“<T>”需要指定一個數據類型,將T替換換指定數據類型后就可以對集合中的元素的數據類型進行約束。

 

1.2.泛型集合List<T>添加、獲取、刪除元素以及遍歷的方法和ArrayList的用法都是類似的。但是List<T>在遍歷訪問元素時無需做類型轉換。

示例:

 

1.3.List<T>與ArrayList的區別

 

2.泛型集合Dictionary<K,V>

Dictionary<K,V>集合類似於前面所講的Hashtable,也是通過Key/value(鍵/值)對元素保存的。

它具有泛型的全部特性,編譯時檢查類型約束,獲取元素時只能通過key而不能通過索引,並且獲取元素時無需類型轉換。

 

2.1.語法:

Dictionary<K,V> 對項目 = new Dictionary<K,V>();

說明:K表示集合中指定Key的類型,V表示Value的類型。他們的含義和List<T>是相同的。

 

2.2.Dictionary<K,V>集合的常用(添加、刪、獲取)操作方法和Hashtable是一樣的,在這里不詳細介紹。

示例:

 

2.3.遍歷Dictionary<K,V>集合:

KeyValuePair<Tkey,Tvalue>是一個泛型結構,定義可設置或者檢索的鍵/值對。詳細內容可以查閱MSDN。

 

2.4.Dictionary<K,V>和Hashtable的對比:


 

 

總結:本文只是對集合做了基礎和細節的介紹,集合在開發中通常用來存儲對象,而在實際的開發中還要結合實際功能深入去學習怎么去運用才是關鍵。

 

 

 


免責聲明!

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



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