Dictionary在asp時代超愛用的物件之一,尤其當你遇上複雜性的表格報表時,更能體會出它的好用
其實在.NET裡還是有Dictionary的存在,只是寫法上有些不同(廢話asp跟C#語法一定不同啊)
宣告方式 Dictionary<TKey,TValue>
| 1 | Dictionary<string, string> mydic = new Dictionary<string, string>(); |
Tkey,TValue可以是不同型態,不一定要是string,它是一個Key配一個Value,Key不能重覆
.ContainsKey(TKey)用來判斷Key是否存在
| 1 | while (dr.Read()) |
| 2 | { |
| 3 | if (!mydic.ContainsKey(dr["id"].ToString())) |
| 4 | mydic.Add(dr["id"].ToString(), dr["name"].ToString()); |
| 5 | } |
取值的時候,使用foreach(KeyValuePair<string, string> pair in mydic)
| 1 | foreach (KeyValuePair<string, string> pair in _ratedic) |
| 2 | { |
| 3 | TextBox1.Text = pair.Value.ToString(); //取Value |
| 4 | TextBox2.Text = pair.Key.ToString(); //取Key |
| 5 | } |
我喜歡用它的原因在於,當我想把一些後面程式會取用的值先保留起來的時候,它就很方便
就不用當後面要用到的時候,還要每一筆資料再回去資料庫Query一次,不僅效能不佳,而且也很麻煩
舉例來說:
畫面顯示一個二維表格,X軸是所有的薪資項目列表,Y軸是員工,這個二維表格要畫出,
每一個員工在本期所領了哪些項目,而且每一個員工不見得每一個薪資項目都有領
這個時候如果乖乖的一個格子一個格子去Query資料,再劃出來,可能需要跑個上百個迴圈
如果採用Dictionary,就好辦多了
Dictionary<string, string> wagedic = new Dictionary<string, string>();
//open一次去Query全部薪資項目個數
| 1 | while (dr.Read()) |
| 2 | { |
| 3 | if (!mydic.ContainsKey(dr["wid"].ToString())) |
| 4 | wagedic.Add(dr["wid"].ToString(), dr["name"].ToString()); |
| 5 | } |
Dictionary<string, string> empdic = new Dictionary<string, string>();
//open一次去Query每一個員工領了哪些項目
| 1 | while (dr.Read()) |
| 2 | { |
| 3 | if (!empdic.ContainsKey(dr["empno"].ToString()+dr["wid"].ToString())) |
| 4 | wagedic.Add(dr["empno"].ToString()+dr["wid"].ToString(), dr["amount"].ToString()); |
| 5 | } |
//開始劃表格
//open去Query一次本期領薪的員工資料
改用Dictionary的方式,只需open三次Query即可,省了不少效能,雖然Dictionary會佔用記憶體
,但結束後它會釋放掉,而記憶體對現在的主機來說,應該不是什麼太大的問題(個人認為啦...)
更進階的運用則是多層Dictionary,也就是Dictionary再包Dictionary,其實是Dictionary具有泛型的特點
因此它可以不挶限於只能是string型態
二層的宣告就變成
Dictionary<string, Dictionary<string,string>> mydic = new Dictionary<string, Dictionary<string,string>>();
取TKey,TValue,則KeyValuePair則要相對變成雙層
| 1 | foreach (KeyValuePair<string, Dictionary<string, string>> key1 in mydic) |
| 2 | { |
| 3 | foreach (KeyValuePair<string, string> key2 in mydic) |
| 4 | { |
| 5 | Response.Write(mydic[Key1.Key][key2].Key); |
| 6 | Response.Write(mydic[Key1.Key][key2].Value); |
| 7 | } |
| 8 | } |
三層的宣告就變成
Dictionary<string, Dictionary<string,Dictionary<string,string>>> mydic = new Dictionary<string, Dictionary<string,Dictionary<string,string>>>();
取TKey,TValue,則KeyValuePair則要相對變成三層
在.NET想事先Keep一些Data,其實也可以運用DataTable或是Hashtable,然而就如先前提到的Dictionary具有泛型(generic)的支援
因此在一些情況下還是得用到Dictionary
浙公网安备 33010602011771号