IDictionary 介面 - HashTable

字典集合中的物件元素,以「索引鍵(key)/值(value)」的格式儲存,每一個元素物件均包含一個與其相對應的索引鍵,我們透過索引鍵存取元素物件,雜湊表算是字典集合的代表。

IDictionary介面提供了字典集合的設計樣式,其同時繼承 ICollection 與IEnumerable 介面,定義一般集合必要的方法成員,例如 Add 與 Clear 等等。

IDictionary 介面最重要者在其屬性成員,包含 Item 、 Valus 以及 Keys ,其中 Item 根據指定的索引鍵回傳集合中對應的值,另外, Values 用以回傳集合中所有存在的物件元素值, Keys 則回傳集合中的所有 Key ,它們均以 ICollection 介面型態出現。

除了屬性成員,IDictionary 另外定義了一個特別的方法成員 GetEnumerator ,這個成員回傳一個字典列舉器,定義如下:
IDictionaryEnumerator GetEnumerator()
其中的 IDictionaryEnumerator 為一繼承 IEnumerator 介面的衍生介面,它提供元素列舉以及「索引鍵/值」存取操作所需的方法成員。

雜湊與 HashTable 類別

雜湊提供類似字典的資料結構,原理是透過數學函數的運算,將集合中元素的索引鍵經由雜湊函數轉換對映成表格中的索引值,此類的表格稱之為雜湊表,索引鍵透過雜湊函數的運算對應至一組雜湊碼(hase code),再透過此雜湊碼形成的索引位址,找到指定的物件元素。

雜湊是一種相當有效率的搜尋方法,即便大型集合物件的操作,在效能上並不會有明顯的落差。

HashTable 類別本身實作了 IDictionary 、 ICollection 、 IEnumerable 、 ISerializable 、IDeserializationCallback 以及 ICloneable 介面,允許你應用「索引鍵/值」對應關係,取得集合中的特定物件。

雜湊類別建立的集合物件,容量依需要自動增加,而其增加容量的行為必須根據一個所謂的載入因數而決定,這個因數決定集合擴充容量的依據,初始容量的預設值為 0 ,而預設的載入因數為 1.0 ,其值則介於 0.1 ~ 1.0 之間。

HashTable 類別提供了多種版本的建構式,其中最簡單的版本不接受任何輸入參數,使用預設的容量以及載入因數,你也可以使用另一個可以指定容量以及載入因數的版本,這個版本接受兩個參數值,其定義如下:
public Hashtable(int capacity,float loadFactor)
其中的 capacity 指定初始化的 HashTable 類別物件所能接受的元素數目,而 loadFactor 則指定這個 HashTable 的載入因數,這個值介於 0.1 ~ 1.0 。

HashTable 類別實作了其繼承介面的相關方法成員,其中比較重要的方法為 GetEnumerator ,這個方法回傳一個 IDictionaryEnumerator 物件,你可以利用它以「索引鍵/值」的方式列舉集合中的內容。

HashTable 類別提供兩個唯讀屬性 - Keys 以及 Values ,其中 Keys 用以取得集合中的鍵值集合,而 Values 則回傳包含相對的數值集合物件,屬性定義如下:
ICollection Keys {get;}
ICollection Values {get;}
另外要注意,由於透過雜湊表運算,元素的排列順序對雜湊並沒有意義,因此無法透過特定順序取得指定的雜湊元素。
class Program
{
    static void Main(string[] args)
    {
        Hashtable hashtable = new Hashtable();
        for (int i = 0; i < 10; i++)
        {
            string objectKey = "key" + (i * 10);
            string objectValue = "Value" + (i * 10);
            hashtable.Add(objectKey, objectValue);
        }
        Console.WriteLine("\n\n … 以下列出 hashtable 集合物件的所有 key 值:\n");
        ICollection keys = hashtable.Keys;
        foreach (string keyString in keys)
        {
            Console.Write(keyString + "\t");
        }
        Console.WriteLine("\n\n … 以下列出 hashtable 集合物件的所有 Value 值:\n");
        ICollection values = hashtable.Values;
        foreach (string valueString in values)
        {
            Console.Write(valueString + "\t");
        }
        Console.WriteLine("\n\n");
        do
        {
            Console.Write("輸入key:");
            string keyValue = Console.ReadLine();
            if (keyValue == "x") break;
            Console.WriteLine("\n KEY:{0},VALUE:{1} \n ", keyValue, hashtable[keyValue]);
        } while (true);
    }
}
宣告一個 HashTable 類別實體物件 hashtable,利用 for 迴圈依序引用 Add 於集合中加入 10 組的「索引鍵/值」資料。 引用屬性 Keys 回傳一個 ICollection 型別物件 keys , myKeys 包含一開始加入集合中的所有鍵值,你可以使用 foreach 敘述,逐一將其取出,此行宣告一個ICollection 物件keys, 儲存 Keys 屬性回傳的集合,接下來利用foreach 依序取出 Keys 當中的索引鍵字串輸出。

繼續引用另外一個屬性 Values ,回傳集合中所有的物件值,再利用 foreach 迴圈敘述將其逐一取出。 最後的 do 迴圈,提示使用者輸入指定的 key 值,取出對應的物件。
… 以下列出 hashtable 集合物件的所有 key 值:

key50   key0    key10   key40   key90   key60   key70   key20   key30   key80

 … 以下列出 hashtable 集合物件的所有 Value 值:

Value50 Value0  Value10 Value40 Value90 Value60 Value70 Value20 Value30 Value80


輸入key:key20

 KEY:key20,VALUE:Value20

輸入key:key10

 KEY:key10,VALUE:Value10

輸入key:x
列舉的索引鍵與值依序對應,輸入特定的key值,可以看到其回應相關的value,最後輸入x離開程式。





沒有留言: