Dictionary<Key,Value>是一個泛型,它本身有集合的功能有時候可以它看成是數組,它的結構是這樣的:Dictionary<[Key],[Value]>,它的特點是存入對象需要與[Key]值一一對應的存入該泛型,通過某一個一定的[Key]去找到對應的值[Key]不能重復。它的單個數組是KeyValuePair<Key,Value>,[Value]可以是string,int 和一個類等等。
在System.Collections.Generic命名空間中,與ArrayList相對應的泛型集合是List<T>,與HashTable相對應的泛型集合是Dictionary<Key,Value>,其存儲數據方式與哈希表相似,通過鍵/值來保存元素,並具有泛型的全部特征,編譯時檢查類型約束,讀取時無需類型轉換。
Dictionary<Key,Value> student = new Dictionary<Key,Value>();
其中“K”為占位符,具體定義時用存儲鍵“Key”的數據類型代替,“Value”也是占位符,用元素的值“Value”的數據類型代替,這樣就在定義該集合時,聲明了存儲元素的鍵和值的數據類型,保證了類型的安全性。
Dictionary<Key,Value>中元素的操作方法與HashTable相似,添加元素,獲取元素,刪除元素,遍歷集合元素的方法基本相同。
Dictionary<Key,Value>和HashTable的區別
Dictionary<Key,Value>和HashTable的相同點:添加元素,刪除元素,通過鍵訪問值的方法相同。
Dictionary<Key,Value>和HashTable的不同點:
Dictionary<Key,Value>對添加的元素具有類型約束,HashTable可添加任意類型的元素。
Dictionary<Key,Value>不需要裝箱、拆箱操作,HashTable添加時裝箱,讀取時拆箱。
Dictionary<Key,Value>集合中,除了通過鍵獲取值得方法外,還有一種TryGetValue(Key)方法,可以通過鍵獲取值,該方法返回值為布爾型,如果存在和鍵相對應的值,則返回true,否則返回false。避免了因獲取不到相應值發生的異常。
代碼示例:
public static void Main(string[] args)
{
//創建Dictionary<K,V>然后添加元素
Dictionary<string, string> film = new Dictionary<string, string>();
film.Add("楊過", "神雕俠侶");
film.Add("聶風", "雄霸天下");
film.Add("令狐沖", "笑傲江湖");
film.Add("張無忌", "倚天屠龍記");
Console.WriteLine("集合現在的元素個數為:{0}", film.Count);
//檢查元素是否存在,如不存在,添加
if (!film.ContainsKey("段譽"))
{
film.Add("段譽", "天龍八部");
}
//遍歷集合
foreach (KeyValuePair<string, string> kvp in film)
{
Console.WriteLine("\t{0}\t{1}", kvp.Key, kvp.Value);
}
//獲取鍵的集合
Dictionary<string, string>.KeyCollection keys = film.Keys;
//遍歷鍵的集合
Console.WriteLine("受歡迎的武俠片中主角名:");
foreach (string str in keys)
{
Console.WriteLine(str);
}
//獲取值的集合
Dictionary<string, string>.ValueCollection values = film.Values;
//遍歷值的集合
Console.WriteLine("受歡迎的武俠片:");
foreach (string strName in values)
{
Console.WriteLine(strName);
}
//遍歷元素的另一種方法
Console.WriteLine("和哈希表相同的遍歷<值>元素方法");
foreach (string strName in film.Values)
{
Console.WriteLine(strName);
}
Console.WriteLine("和哈希表相同的遍歷<鍵>元素方法");
foreach (string str in film.Keys)
{
Console.WriteLine(str);
}
//獲取鍵對應值的TryGetValue方法
string objfilm = string.Empty;
if (film.TryGetValue("段譽", out objfilm))
{
Console.WriteLine("主角為段譽的電影是:{0}", objfilm);
}
else
{
Console.WriteLine("沒有主角為段譽的電影");
}
Console.ReadKey();
}