字典
關鍵字:Dicitionary
?
說明:
必須包含命名空間System.Collection.Generic
Dictionary里面的每一個元素都是一個鍵值對(由兩個元組組成:鍵和值).
鍵必須是唯一的,而值不需要唯一的.
鍵和值都可以是任意類型(例如:string,int,自定義類型,等等)
通過一個鍵讀取一個值的事件是接近O(1)
鍵值對之間的偏序可以不定義
?
?
使用案例:
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.Threading.Tasks;
using?System.Collections.Generic;
namespace?字典
{
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????//定義
????????????Dictionary<string,?string>?openWith?=?new?Dictionary<string,?string>();
?
????????????//添加元素
????????????openWith.Add("txt",?"notepad.exe");
????????????openWith.Add("bmp",?"paint.exe");
????????????openWith.Add("dib",?"paint.exe");
????????????openWith.Add("rtf",?"wordpad.exe");
?
????????????//取值
????????????Console.WriteLine("For?key?=?\"rtf\",?value?=?{0}.",?openWith["rtf"]);
?
????????????//更改值
????????????openWith["rtf"]?=?"winword.exe";
????????????//查看
????????????Console.WriteLine("For?key?=?\"rtf\",?value?=?{0}.",?openWith["rtf"]);
?
????????????//遍歷Key
????????????foreach?(var?item?in?openWith.Keys)
????????????{
????????????????Console.WriteLine("Key?=?{0}",?item);
????????????}
?
????????????//遍歷value
????????????foreach?(var?item?in?openWith.Values)
????????????{
????????????????Console.WriteLine("value?=?{0}",?item);
????????????}
?
????????????//遍歷value的第二種方法
????????????Dictionary<string,?string>.ValueCollection?valueColl?=?openWith.Values;
????????????foreach?(var?item?in?valueColl)
????????????{
????????????????Console.WriteLine("value?=?{0}",?item);
????????????}
?
?
????????????//遍歷字典
????????????foreach?(KeyValuePair<string,?string>?item?in?openWith)
????????????{
????????????????Console.WriteLine("key?=?{0}?,?value?=?{1}?",?item.Key,?item.Value);
????????????}
?
????????????//添加存在的元素
????????????try
????????????{
????????????????openWith.Add("txt",?"winword.exe");
????????????}
????????????catch?(ArgumentException)
????????????{
????????????????Console.WriteLine("An?element?with?Key?=?\"txt\"?already?exists.");
????????????}
?
?
????????????//刪除元素
????????????openWith.Remove("doc");
????????????if?(!openWith.ContainsKey("doc"))
????????????{
????????????????Console.WriteLine("Key?\"doc\"?is?not?found.");
????????????}
?
????????????//判斷鍵存在
????????????if?(openWith.ContainsKey("bmp"))
????????????{
????????????????Console.WriteLine("An?element?with?Key?=?\"bmp\"?exists.");
????????????}
?
????????????//參數為其他類型
????????????Dictionary<int,?string[]>?OtherType?=?new?Dictionary<int,?string[]>();
????????????OtherType.Add(1,?"1,11,111".Split(','));
????????????OtherType.Add(2,?"2,22,222".Split(','));
????????????Console.WriteLine("其他類型?:?"?+?OtherType[1][2]);
?
?
????????????//參數為自定義類型
????????????//聲明并添加元素
????????????Dictionary<int,?DouCube>?MyType?=?new?Dictionary<int,?DouCube>();
????????????for?(int?i?=?1;?i?<=?9;?i++)
????????????{
????????????????DouCube?element?=?new?DouCube();
????????????????element.Code?=?i?*?100;
????????????????element.Page?=?"http://www.doucube.com/"?+?i.ToString()?+?".html";
????????????????MyType.Add(i,?element);
????????????}
?
?
????????????//遍歷元素
?
????????????foreach?(KeyValuePair<int,?DouCube>?kvp?in?MyType)
????????????{
????????????????Console.WriteLine("Index?{0}?Code:{1}?Page:{2}",?kvp.Key,?kvp.Value.Code,?kvp.Value.Page);
????????????}?
????????}
?
????}
????public?class?DouCube
????{
????????public?int?Code?{?get?{?return?_Code;?}?set?{?_Code?=?value;?}?}?private?int?_Code;
????????public?string?Page?{?get?{?return?_Page;?}?set?{?_Page?=?value;?}?}?private?string?_Page;
????}
}
?
?
常用屬性
名稱 | 說明 |
Comparer | 獲取用于確定字典中的鍵是否相等的IEqualityComParer<T> |
Count | 獲取包含在Dictionary<TKey,TValue>中的鍵/值對的數目 |
Item | 獲取或設置與指定的鍵相關聯的值 |
Keys | 獲取包含Dictionary<TKey,TValue>中的鍵的集合 |
Values | 獲取包含Dictionary<TKey,TValue>中的值的集合 |
?
常用方法
名稱 | 說明 |
Add | 將指定的鍵和值添加到字典中 |
Clear | 從Dictionary<TKey,TValue>中移除所有的鍵和值 |
ContainsKey | 確定Dictionary<TKey,TValue>是否包含指定的鍵 |
ContainsValue | 確定Dictionary<TKey,TValue>是否包含指定的值 |
Equals(object) | 確定指定的Object是否等于當前的object(繼承自object) |
Finalize | 允許對象在”垃圾回收”回收之前嘗試釋放資源并執行其他清理操作(繼承自object) |
GetEnumerator | 返回循環訪問Dictionary<TKey,TValue>的枚舉器 |
GetHashCode | 用作特定類型的哈希函數(繼承自object) |
GetObjectData | 實現System.Runtime.Serialization.ISerializable接口,并返回序列化Dictionary<TKey,TValue>實例所需的數據 |
GetType | 獲取當前實例的Type(繼承自Object) |
MemberwiseClone | 創建當前object的淺表副本(繼承自Object) |
OnDeserialization | 實現System.Runtime.Serialization.ISerializable接口,并在完成反序列化之后引發序列化事件 |
Remove | 從Dictionary<TKey,Tvalue>中移除所指定的鍵的值 |
ToString | 返回表示當前對象的字符串 |
TryGetValue | 獲取與指定的鍵相關聯的值. |
?
?
?
總結Dictionary:
字典也稱為映射表或散列表,主要特定是可以根據鍵快速查找值,也可以自由刪除添加元素,在刪除添加時,不會像列表一樣,移動之后的所有元素,產生內存的開銷.
.NET中提供了幾個字典,可以使用最主要的類是Dictionary<TKey,TValue>,這個類與我們上面說的SoreedList用法完全一樣.
鍵的類型:
用作字典中鍵的類型必須重寫object類中的GetHashCode()方法,只要字典類需要確定元素的位置,就要調用本方法.
字典內部通過調用這個方法的返回值,來計算產生散列(這是一個算法,不去研究,它涉及一個素數),所以字典的容量是一個素數.
GetHashCode()方法的實現需要遵循以下幾點:
1.相同的對象應總是返回相同的值
2.不同的對象可以返回相同的值
3.應執行額比較快,計算的開銷不大
4.不能拋出異常
5.應至少使用一個實例字段
6.散列碼值應平均分布在int可以存儲的整個數字區域
7.散列碼最好在對象的生存期中不發生變化
?
?
提示:字典的性能取決于GetHashCode()方法的實現代碼
?