泛型集合的聲明格式
泛型集合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; }
}
泛型集合的聲明與使用
List與Dictionary都類似一個容器
Dictionary<K,V>是一個關聯數組或地圖,是一個可以通過任何類型的值索引的容器
List是一個整數索引數組,是一個可以通過索引的容器
是以,本質上的差別:1)容器的索引方式 2)List的索引是連續的,而Dictionary<int,T>的索引可能存在間隙