Dictionaryasp時代超愛用的物件之一,尤其當你遇上複雜性的表格報表時,更能體會出它的好用
其實在.NET裡還是有Dictionary的存在,只是寫法上有些不同(廢話aspC#語法一定不同啊)

宣告方式 Dictionary<TKey,TValue> 

 

1 Dictionary<stringstring> mydic = new Dictionary<stringstring>(); 

 

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<stringstring> pair in _ratedic)  
2 {  
3     TextBox1.Text = pair.Value.ToString(); //取Value  
4     TextBox2.Text = pair.Key.ToString(); //取Key  
5

 

我喜歡用它的原因在於,當我想把一些後面程式會取用的值先保留起來的時候,它就很方便

就不用當後面要用到的時候,還要每一筆資料再回去資料庫Query一次,不僅效能不佳,而且也很麻煩

舉例來說:

畫面顯示一個二維表格,X軸是所有的薪資項目列表,Y軸是員工,這個二維表格要畫出,

每一個員工在本期所領了哪些項目,而且每一個員工不見得每一個薪資項目都有領

這個時候如果乖乖的一個格子一個格子去Query資料,再劃出來,可能需要跑個上百個迴圈 

 

1 for (int i=1;i<=全部薪資項目個數;i++) //假設有50個薪資,這裡就有50次loop  
2 {  
3       for(int j=1;j<=本期有領薪水的員工數;j++) //假設有500個員工  
4      {  
5          //開始open/close資料庫去Query每一個薪資項目針對這個員工有沒有領取記錄  
6         //二層loop加起來,就要跑50*500次open/close的Query  
7       }  
8

 

如果採用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一次本期領薪的員工資料

 

1 while (dr.Read())  
2 {  
3     //可以取得員工姓名,工號  
4     Key1=dr["empno"]  
5    foreach (KeyValuePair<stringstring> pair in wagedic)  
6    {  
7       Key2=pair.Key  
8       if (empdic.ContainsKey(Key1.ToString()+Key2.ToString()))  
9              //show amount  
10       else 
11             //代表沒有領取  
12      }  
13

 

 改用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<stringstring>> key1 in mydic)  
2 {  
3    foreach (KeyValuePair<stringstring> 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則要相對變成三層 

 

1 foreach (KeyValuePair<string, Dictionary<string, Dictionary<stringstring>>> key1 in _termratedic)  
2 {  
3   foreach (KeyValuePair<string, Dictionary<string, Dictionary<string,string>>> key2 in _termratedic)  
4   {  
5      foreach (KeyValuePair<string, Dictionary<stringstring>> key3 in _termratedic)  
6      {  
7          Response.Write(mydic[Key1.Key][key2.Key][key3].Key);  
8          Response.Write(mydic[Key1.Key][key2.Key][key3].Value);  
9      }  
10   }  
11 }   

 

在.NET想事先Keep一些Data,其實也可以運用DataTable或是Hashtable,然而就如先前提到的Dictionary具有泛型(generic)的支援

因此在一些情況下還是得用到Dictionary

posted on 2009-05-26 13:47  dfg727  阅读(3000)  评论(1)    收藏  举报