C#中存儲數據的集合:數組、集合、泛型、字典

爲何把這4個東西放在一塊兒來講,由於c#中的這4個對象都是用來存儲數據的集合……。c#

首先我們把這4個對象都聲明並實例化一下:數組

//數組

        string[] m_Str = new string[5]; //集合
 ArrayList m_AList = new ArrayList(); //泛型集合
 List<int> m_List = new List<int>(); //字典
 Dictionary<int, string> m_Dt = new Dictionary<int, string>();

你們看看這4個對象放在一塊兒從外觀上有什麼異同?安全

我給你們提個醒,看看他們是否是都有NEW關鍵字,也就是說他們都須要實例化,在說明白點他們都是引用類型(不知道引用類型爲什麼物的也不用特別糾結,之後會專門說說這個區別)。post

好了我們繼續看性能

數組

聲明數組時[]裏面有一個數字「5」,對了這就是區別,數組在聲明的時候必需要指定長度。這是由於數組在內存中是連續存儲的,因此它的索引速度很是快,並且賦值與修改元素也很簡單。還有一點就是數組在聲明定義的時候就指定了類型,咱們定義的數組的類型是string的,並且由於數組是連續的,這就致使咱們想在這個數組的第一個元素和第二個元素之間插隊,插進一個成員是很不方便的。這就致使了咱們須要一個數據集合,這個集合能夠方便的讓咱們對該集合的成員進行add/delete/insert的操做.這就出現了集合(ArrayList)。spa

//數組

 string[] m_Str = new string[5]; m_Str[0] = "a"; m_Str[1] = "a"; m_Str[2] = "a";

 

集合

我們看第2個對象集合(ArrayList),它在聲明的時候既沒有大小,也沒有類型,這說明啥?說明他的大小是動態的你能夠隨意的add/delete/insert 如:code

//集合
 ArrayList m_AList = new ArrayList(); m_AList.Add("a"); m_AList.Add(10); m_AList.Add(true); m_AList.RemoveAt(0); m_AList.Insert(1, "aa");

你們可能注意到集合ArrayList中Add的成員有字符串、數值、布爾值。這就說明了一個問題,集合中的每個成員都是Object類型的,它把具體的成員裝箱到object中在加入到本身。若是要是使用集合中的成員,由於成員是object類型的,因此也要拆箱到具體的類型中後再進行操做和使用。這樣就會出現問題:一、消耗性能(頻繁的拆箱和裝箱)二、不安全,好比說上面的集合對象的第一個成員是字符型的,你取出來後和一個數值型的變量進行運算,就會報錯……。那麼接下來就又出現了一個對象——泛型集合(List<T>)對象。對象

泛型

泛型集合list<T>對象,你們可能一看見這個就蒙了,反正我一開始看見是蒙了,尖括號是啥,T是啥?別慌,其實不難,尖括號就是一種語法,至於T能夠理解成佔位符,它能夠是string、int、bool……等。我們看看代碼的用法:blog

//泛型集合
 List<int> m_List = new List<int>(); m_List.Add(10); m_List.Add(10); m_List.Add(10); m_List.RemoveAt(0); m_List.Insert(1,12);

看起來好像和集合(ArrayList)的用法差很少,其實就是差很少了,哈哈。惟一的區別在於在聲明泛型集合(List<T>)的時候須要制定裏面成員的類型,上面的檢討集合咱們制定的類型是int的,這就是說你添加的成員必須也是int的,這會有啥好處?1.數據安全了,你添加string等非int類型的成員添加不進去(編譯都過不去),這樣數據就安全惟一了,2.節省的性能,不須要每一操做成員的時候都要拆箱和裝箱了。索引

泛型集合相比集合就相對完美了……

泛型集合ListC#-注意事項

1】 使用前必須實例化

能夠單純實例化、也能夠實例化時使用「集合初始化器」初始化。

2】經常使用方法

添加元素:Add()、Insert()

刪除元素:RemoveAt(索引)、Remove(對象)、Clear()

3】經常使用屬性

獲取元素個數:Count(對比數組 :Length

4】集合遍歷

使用for循環、也可使用foreach循環。

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ListDemo { class Program { static void Main(string[] args) { //泛型集合的基本使用
List<int> scoreList = new List<int>(); scoreList.Add(98); scoreList.Add(28); scoreList.Add(38); scoreList.Add(78); scoreList.Add(88); //List<string> nameList = new List<string>();
scoreList.Insert(2, 70); //獲取元素總數
Console.WriteLine("獲取元素總數:"+scoreList.Count ); Console.WriteLine("_________________"); //Console.ReadLine(); //遍歷集合
Console.WriteLine("遍歷輸出在第一種方法:"); foreach (int score in scoreList) { Console.WriteLine(score); } Console.WriteLine("_________________"); Console.WriteLine("遍歷輸出在第二種方法:"); for (int i = 0; i < scoreList.Count; i++) { Console.WriteLine(scoreList[i]); } //刪除一個元素
Console.WriteLine("_________________"); Console.WriteLine(" 刪除一個元素"); scoreList.Remove(70); scoreList.Remove(2); for (int i = 0; i < scoreList.Count; i++) { Console.WriteLine(scoreList[i]); } Console.WriteLine("_________________"); Console.WriteLine("清除全部元素"); scoreList.Clear(); Console.WriteLine("獲取元素總數:" + scoreList.Count); Console.ReadLine(); } } }

字典Dictionary

最後我們說說字典Dictionary<TKey, TValue>,你們一看又蒙了,別慌,想一想剛纔的泛型集合(List<T>)

同樣的,尖括號仍是語法,你遵循就行了。而這一次的佔位符不是T了,「由於第一個是索引,第二個是具體的值內容,」索引佔位符變成額TKey, TValue。就這麼簡單呢。

下面我們看看語法:

//字典
 Dictionary<int, string> m_Dt = new Dictionary<int, string>(); m_Dt.Add(0, "a"); m_Dt.Add(1, "b"); m_Dt.Add(0, "c"); string str=m_Dt[0];

看着用法仍是比較簡單的吧,拿m_Dt.Add(0, "a");這一句來講0是該字典的【索引】,【值】是字符串a。要根據字典的【索引】找到具體的【值】,語法就是m_Dt[0];這樣就取到了字符串a.

你們回憶一下:由於數組的使用不方便,因此有了集合(ArrayList)。由於集合(ArrayList)的不安全和消耗性能因此有了泛型集合(list<T>).這就是這3者的關係——彌補缺點。至於字典這個由於它也是儲蓄一組數據的集合,同時用到了泛型的東西,因此放在一塊兒來講了。

好了這常見的4個儲存一組數據的對象我們就講完了,下一章引用類型和值類型我們見。

相關文章
相關標籤/搜索