天天看點

C# - 泛型集合List與Dictionary,兩者的差異,裝箱,拆箱

作者:源丁程式設計

泛型集合的聲明格式

泛型集合List與Dictionary位于System.Collections.Generic;命名空間下

//泛型List
List<T> list =new List<T>();
//聲明一個int類型的集合(T 就被 int 代替)
List<int> list =new List<int>();
List 表示泛型集合
List<int> 表示目前集合的類型(隻能添加int類型的元素)
T 用于限制集合中元素的資料類型,可以說是Type的簡寫
  可以使用任何字母代替如 X,h1,yT等等

//泛型Dictionary
Dictionary<K, V> dict = new Dictionary<K, V>();
//K,V 相當于 Key Value的簡寫
//K,V與上面的T作用一樣,也可以看做是輸出中的占位符
//聲明一個鍵是int類型,值是string類型的集合
Dictionary<int, string> dict = new Dictionary<int, string>();           

注意事項:

1)集合等号兩側<>中對應位置的資料類型必須一樣;類型可以是簡單的如int,string,bool等,也可以是複雜的如枚舉,結構,類等,看具體需要将具體類型替換T/K/V這些"占位符"

2)一旦确定了集合的類型,隻能添加對應的資料類型(相容與強制轉換的都可以)

注意事項 1 (VS有提示,無法通過編譯)
聲明時的錯誤
List<int> list =new List<string>();
前面是 int,string  後面變成了  int,int 
Dictionary<int, string> dict = new Dictionary<int, int>();

添加元素時的錯誤
List<int> list =new List<int>();
list.Add("1");//添加了字元串類型的元素
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add("1",0);
dict.Add("1","0");
dict.Add(1,0);
......
添加元素時會有對應位置的類型提示           

上面行号12的代碼不止類型對應的元素弄錯,鍵也重複了,會報異常(添加了重複的鍵)

兩種泛型集合的具體屬性與方法不再一一列舉聲明(都有提示)

注意:ToArray()方法,List集合是什麼類型就用什麼類型的集合接收
List<int> list =new List<int>();
int類型集合用 int類型數組接收
int[] nums=list.ToArray();
List<string> list =new List<string>();
string[] strs=list.ToArray();
其他接收類型以此類推           

泛型集合的List與Dictionary可以說是非泛型集合ArrayList與Hashtable的"更新"版

主要差別在于:

1)非泛型集合(前者)存儲資料友善(都是object)泛型集合(後者)存儲的是固定類型的資料

2)前者使用時不友善(會發生裝箱,拆箱操作,影響性能)後者可以使用指定類型接收集合中的元素,安全且高效

前者可以說是強類型(隻能存儲同一類型資料)後者是弱類型(可以存儲任意類型資料)

裝箱,拆箱:暫時了解為将集合的元素進行值類型與引用類型互相轉換(頻繁操作記憶體)使用非泛型類型的資料時最易發生裝箱,拆箱操作

3)泛型集合是有序集合即讀取元素時按存儲的順序取出

聲明與使用

static void Main(string[] args)
{
    #region List
    //簡單資料類型
    List<int> list = new List<int>();
    //複雜資料類型
    //此時的Person類可以看做是實體類
    List<Person> listP = new List<Person>();
    Person p1 = new Person();
    p1.Name = "張三";
    p1.Age = 18;
    listP.Add(p1);
    Person p2 = new Person() { Name = "李四", Age = 19 };
    listP.Add(p2);
    //新方式,不要接收變量
    listP.Add(new Person() { Name = "王五", Age = 20 });
    //周遊輸出
    foreach (Person p in listP)
    {
        Console.WriteLine("姓名 {0}  年齡 {1}", p.Name, p.Age);
    }
    Console.WriteLine("");
    //===========================================
    //隻為示範泛型鍵值對集合的應用
    Dictionary<int, Hot> dict = new Dictionary<int, Hot>();
    dict.Add(1, new Hot() { HTitle = "新版字典删除\"倭寇\"", TContent = "近日,有網友稱,新版《新華字典》中将\"倭寇\"一詞删除引發關注;27日,記者在新華書店探訪發現,第12版《新華字典》确實沒有了\"倭寇\"一詞,出版社回應稱,他們已知曉此事,有關機關正在\"調查\"中..." });
    dict.Add(2, new Hot() { HTitle = "托關系進普高被騙無法聯考", TContent = "近日,武漢的董女士向《經視直播》反映,她女兒在武漢市漢南第一中學借讀三年,在報名今年聯考時,卻發現女兒竟然沒有普高學籍,無法參加聯考,原因在于三年前托關系花費12萬給中間人,卻無學籍因而無法聯考,詳細情況,有關部分正在\"辦理\"中..." });
    dict.Add(3, new Hot() { HTitle = "315曝光苦情戲直播帶貨", TContent = "揭露的消費黑幕中,直播間裡\"苦情戲\"讓不少老人沉迷其中;這類主播裝出一副正義凜然的樣子幫助解決糾紛,無一例外都能機緣巧合得到号稱能治療疾病的産品,并且賣給觀看直播的老人們,但其實都是普通食品;有網友對直播平台提出質疑,也有網友建議\"重罰直播平台\",還有網友認為直播賬号\"封了又開\"不能徹底解決問題..." });
    //周遊輸出鍵
    foreach (int key in dict.Keys)
    {
        Console.WriteLine(key);
    }
    //周遊輸出值
    foreach (Hot h in dict.Values)
    {
        Console.WriteLine("事件名稱 {0}  事件内容 {1}", h.HTitle, h.TContent);
    }
    //同時周遊鍵,值
    foreach (KeyValuePair<int, Hot> item in dict)
    {
        //值輸出的是完全限定名稱(命名空間.類名)
        //可以進行重寫(昨天說過)
        Console.WriteLine("鍵: {0}  值: {1}", item.Key, item.Value);
    }
    #endregion
    Console.ReadKey();
}
//引用的類
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }    
}
public class Hot
{
    public string HTitle { get; set; }
    public string TContent { get; set; }
}           
C# - 泛型集合List與Dictionary,兩者的差異,裝箱,拆箱

泛型集合的聲明與使用

List與Dictionary都類似一個容器

Dictionary<K,V>是一個關聯數組或地圖,是一個可以通過任何類型的值索引的容器

List是一個整數索引數組,是一個可以通過索引的容器

是以,本質上的差別:1)容器的索引方式 2)List的索引是連續的,而Dictionary<int,T>的索引可能存在間隙