C#的集合類(二)Hashtable、SortedList、Dictionary

 

哈希表(Hashtable)

     Hashtable用於處理和表現相似key/value的鍵值對,其中key一般可用來快速查找,同時key是區分大小寫;value用於存儲對應於key的值。Hashtable中key/value鍵值對均爲object類型,因此Hashtable能夠支持任何類型的key/value鍵值對.
  添加一個key/value鍵值對:HashtableObject.Add(key,value);
  去除某個key/value鍵值對:HashtableObject.Remove(key);
  移除全部元素:           HashtableObject.Clear();
  是否包含特定鍵key:      HashtableObject.Contains(key);
     Hashtable ht=new Hashtable(); //建立一個Hashtable實例
     ht.Add("E","e");//添加key/value鍵值對
     ht.Add("A","a");
     string s=(string)ht["A"];
     if(ht.Contains("E")) //判斷哈希表是否包含特定鍵,其返回值爲true或false
       Console.WriteLine("the E key:exist");
     ht.Remove("C");//移除一個key/value鍵值對
     Console.WriteLine(ht["A"]);//此處輸出a
     ht.Clear();//移除全部元素
     Console.WriteLine(ht["A"]); //此處將不會有任何輸出

遍歷哈希表須要用到DictionaryEntry Object,代碼以下:
for(DictionaryEntry de in ht) //ht爲一個Hashtable實例
{
    Console.WriteLine(de.Key);//de.Key對應於key/value鍵值對key
    Console.WriteLine(de.Value);//de.Key對應於key/value鍵值對value
}
     對哈希表進行排序在這裏的定義是對key/value鍵值對中的key按必定規則從新排列,可是實際上這個定義是不能實現的,由於沒法直接在Hashtable進行對key進行從新排列,若是須要Hashtable提供某種規則的輸出,能夠採用一種變通的作法:

ArrayList akeys=new ArrayList(ht.Keys); //別忘了導入System.Collections
akeys.Sort(); //按字母順序進行排序
foreach(string skey in akeys)
{
    Console.Write(skey + ":");
    Console.WriteLine(ht[skey]);//排序後輸出
}



SortedList類:表示鍵/值對的集合,與哈希表相似,區別在於SortedList中的Key數組排好序的。

            SortedList sl = new SortedList();
            sl["c"] = 41;
            sl["a"] = 42;
            foreach (DictionaryEntry element in sl)
            {
                string s = (string)element.Key;
                int i = (int)element.Value;
                Console.WriteLine("{0},{1}", s, i);
            }






Dictionary 泛型集合

    泛型最多見的用途是泛型集合,命名空間System.Collections.Generic 中包含了一些基於泛型的集合類,使用泛型集合類能夠提供更高的類型安全性,還有更高的性能,避免了非泛型集合的重複的裝箱和拆箱。
    不少非泛型集合類都有對應的泛型集合類:rrayList,List<T>;HashTable,DIctionary<T>;Queue,Queue<T>;

Stack,Stack<T>;SortedList,SortedList<T>

 Dictionary<string, string> myDic = new Dictionary<string, string>();
    myDic.Add("aaa", "111");
    myDic.Add("bbb", "222");
    myDic.Add("ccc", "333");
    myDic.Add("ddd", "444");
    //若是添加已經存在的鍵,add方法會拋出異常
    try
    {
        myDic.Add("ddd","ddd");
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine("此鍵已經存在:" + ex.Message);
    }
    //解決add()異常的方法是用ContainsKey()方法來判斷鍵是否存在
    if (!myDic.ContainsKey("ddd"))
    {
        myDic.Add("ddd", "ddd");
    }
    else
    {
        Console.WriteLine("此鍵已經存在:");
    }
    //而使用索引器來負值時,若是建已經存在,就會修改已有的鍵的鍵值,而不會拋出異常
    myDic ["ddd"]="ddd";
    myDic["eee"] = "555";
    //使用索引器來取值時,若是鍵不存在就會引起異常
    try
    {
        Console.WriteLine("不存在的鍵\"fff\"的鍵值爲:" + myDic["fff"]);
    }
    catch (KeyNotFoundException ex)
    {
        Console.WriteLine("沒有找到鍵引起異常:" + ex.Message);
    }
    //解決上面的異常的方法是使用ContarnsKey() 來判斷時候存在鍵,若是常常要取健值得化最好用 TryGetValue方法來獲取集合中的對應鍵值
    string value = "";
    if (myDic.TryGetValue("fff", out value))
    {
        Console.WriteLine("不存在的鍵\"fff\"的鍵值爲:" + value );
    }
    else
    {     
        Console.WriteLine("沒有找到對應鍵的鍵值"); 
    }
     //下面用foreach 來遍歷鍵值對
    //泛型結構體 用來存儲健值對
    foreach (KeyValuePair<string, string> kvp in myDic)
    {
        Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);
    }
    //獲取值得集合
    foreach (string s in myDic.Values)
    {
        Console.WriteLine("value={0}", s);
    }
    //獲取值得另外一種方式
    Dictionary<string, string>.ValueCollection values = myDic.Values;
    foreach (string s in values)
    {
        Console.WriteLine("value={0}", s);
    }
相關文章
相關標籤/搜索