C#中Dictionary的用法(取值/新增/編輯/刪除/排序)及用途【Good!】
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
Dictionary Dictionary<[key], [value]> 他的特點是存入對象是需要與[key]值一一對應(yīng)的存入該泛型,通過某一個一定的[key]去找到對應(yīng)的值。舉個例子: //實例化對象 Dictionary<int,string>dic=new Dictionary<int,string>(); //元素添加,要確保key還沒有,否則會報錯 dic.Add(1, "one"); dic.Add(2, "two"); dic.Add(3, "one"); //另外一種元素添加方法,無需判斷key是否存在,無則新增,有則更新 dic[1]="one";dic[2]="two"; dic[3]="one"; //提取元素的方法 string a = dic[1]; string b = dic[2]; string c = dic[3]; //1、2、3是鍵,分別對應(yīng)“one”“two”“one” //上面代碼中分別把值賦給了a,b,c //注意,鍵相當(dāng)于找到對應(yīng)值的唯一標(biāo)識,所以不能重復(fù) //但是值可以重復(fù) //更新元素,其實和上面的新增是同一個,無需判斷key是否存在,無則新增,有則更新 dic[1]="one";dic[2]="two"; dic[3]="one"; 更詳細用法以 key 的類型為 int,value 的類型為 string 為例: //創(chuàng)建及初始化 Dictionary<int,string>myDictionary=new Dictionary<int,string>(); //添加元素,要確保key還沒有,否則會報錯 myDictionary.Add(1,"C#"); myDictionary.Add(2,"C++"); myDictionary.Add(3,"ASP.NET"); myDictionary.Add(4,"MVC"); //另外一種元素添加方法,無需判斷key是否存在,無則新增,有則更新 myDictionary[2]="C++"; myDictionary[3]="ASP.NET"; myDictionary[4]="MVC"; //通過Key查找元素 if(myDictionary.ContainsKey(1)) { Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]); } //通過KeyValuePair遍歷元素 foreach(KeyValuePair { Console.WriteLine("Key = {0}, Value = {1}",kvp.Key, kvp.Value); } //僅遍歷鍵 Keys 屬性 Dictionary foreach(int key in keyCol) { Console.WriteLine("Key = {0}", key); } //僅遍歷值 Valus屬性 Dictionary foreach(string value in valueCol) { Console.WriteLine("Value = {0}", value); } //通過Remove方法移除指定的鍵值 myDictionary.Remove(1); if(myDictionary.ContainsKey(1)) { Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]); } else{ Console.WriteLine("不存在 Key : 1"); } //遍歷key foreach (string key in openWith.Keys) {
Console.WriteLine("Key = {0}", key); }
//遍歷value foreach (string value in openWith.Values) {
Console.WriteLine("value = {0}", value); } //遍歷value, Second Method Dictionary<string, string>.ValueCollection valueColl =
openWith.Values; foreach (string s in valueColl) {
Console.WriteLine("Second Method, Value = {0}", s);
}
//遍歷字典 foreach (KeyValuePair<string, string> kvp in openWith) {
Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); }
//判斷鍵存在 if (openWith.ContainsKey("bmp")) // True {
Console.WriteLine("An element with Key = \"bmp\" exists."); } 參數(shù)為其他類型: //參數(shù)為其它類型 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]); 幾條建議: 1、給Dictionary添加元素時,建議直接用中括號的方式,而不是使用Add方法。 任何鍵key都必須是唯一的,不能添加相同key的鍵值,不然就會報錯。雖然不管是用[]還是Add方法,調(diào)用的都是Dictionary的Insert函數(shù),但是區(qū)別在于用Add函數(shù)的話,如果已經(jīng)存在同樣的鍵對值,會直接拋出ArgumentException,這意味著后續(xù)的代碼都不執(zhí)行了,這可很要命,明明是一個小問題,可看上去可能是一個大Bug。而用中括號屬性的方法,如果不存在會添加,如果存在則進行改寫,只要key值不為null,是不會拋出異常的。 2、利用TryGetValue(TKey key, out TValue value)接口獲取Dictionary中的數(shù)據(jù)。 法一:ContainsKey(key) 方法:if(myDictionary.ContainsKey(key)) { // 通過key索引value int resValue = myDictionary[key]; } 法二:TryGetValue方法: int resValue ; myDictionary.TryGetValue(key, out resValue); 根據(jù)key取value,最好使用 TryGetValue 而不是 ContainsKey+ 根據(jù)key索引value。使用TryGetValue更快,性能更好,因為只用了一次查找,TryGetValue 比 ContainsKey 后使用[key]取value,速度快一倍。TryGetValue更安全,找不到value時返回false;而使用ContainsKey后使用[key]取value取不到時,會拋出異常導(dǎo)致真機卡死。string GetDictionaryVal(string strkey) { if (!dicTest.ContainsKey(strkey)) { return string.Empty; } return dicTest[strkey]; } 上面這段代碼其實非常正確,但是從效率的角度上看卻對dictionary進行兩遍的查找:ContainsKey和下標(biāo)操作各一次。所以我們可以這么寫: string GetDictionaryVal(string strkey) { string strVal = string.Empty; dicTest.TryGetValue(strkey, out strVal); return strVal; } TryGetValue函數(shù)的返回值為bool值,表示是否存在于Dictionary中。 如果你還看不懂我最后給你舉一個通俗的例子: 有一缸米,你想在在每一粒上都刻上標(biāo)記,不重復(fù),相當(dāng)于“鍵”當(dāng)你找的時候一一對應(yīng)不會找錯,這就是這個泛型的鍵的-作用,而米可以一樣,我的意思你明白了吧?
------------------------------------------------------------------------- c# 對dictionary類進行排序用什么接口實現(xiàn) 如果使用.Net Framework 3.5的話,事情就很簡單了。呵呵。 如果不是的話,還是自己寫排序吧。 using System; using System.Collections.Generic; using System.Text; using System.Linq; namespace DictionarySorting //排序,通過KeyValuePair遍歷元素 { class Program { static void Main(string[] args) { Dictionary<int,string>dic=new Dictionary<int,string>(); dic.Add(1, "HaHa"); dic.Add(5, "HoHo"); dic.Add(3, "HeHe"); dic.Add(2, "HiHi"); dic.Add(4, "HuHu"); var result = from pair in dic orderby pair.Key select pair; //關(guān)鍵在本行 foreach (KeyValuePair { Console.WriteLine("Key:{0}, Value:{1}", pair.Key, pair.Value); } Console.ReadKey(); } } } 【執(zhí)行結(jié)果】 Key:1, Value:HaHa Key:2, Value:HiHi Key:3, Value:HeHe Key:4, Value:HuHu Key:5, Value:HoHo Dictionary的基本用法。假如: 需求:現(xiàn)在要導(dǎo)入一批數(shù)據(jù),這些數(shù)據(jù)中有一個稱為公司的字段是我們數(shù)據(jù)庫里已經(jīng)存在了的,目前我們需要把每個公司名字轉(zhuǎn)為ID后才存入數(shù)據(jù)庫。 分析:每導(dǎo)一筆記錄的時候,就把要把公司的名字轉(zhuǎn)為公司的ID,這個不應(yīng)該每次都查詢一下數(shù)據(jù)庫的,因為這太耗數(shù)據(jù)庫的性能了。 解決方案:在業(yè)務(wù)層里先把所有的公司名稱及相應(yīng)的公司ID一次性讀取出來,然后存放到一個Key和Value的鍵值對里,然后實現(xiàn)只要把一個公司的名字傳進去,就可以得到此公司相應(yīng)的公司ID,就像查字典一樣。對,我們可以使用字典Dictionary操作這些數(shù)據(jù)。 示例:SetKeyValue()方法相應(yīng)于從數(shù)據(jù)庫里讀取到了公司信息。 /// /// 定義Key為string類型,Value為int類型的一個Dictionary /// /// protected Dictionary { Dictionary<int,string>dic=new Dictionary<int,string>(); dic.Add("公司1", 1); dic.Add("公司2", 2); dic.Add("公司3", 3); dic.Add("公司4", 4); return dic; } /// /// 得到根據(jù)指定的Key行到Value /// protected void GetKeyValue() { Dictionary //測試得到公司2的值 int directorValue = myDictionary["公司2"]; Response.Write("公司2的value是:" + directorValue.ToString()); }
該文章在 2021/3/5 16:10:33 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |