如何创建和使用哈希表
本示例阐释如何创建和使用哈希表。哈希表是由键-值组合构成的集合,组织到"存储桶"中以供快速搜索。可以通过键或关联的值搜索哈希表;但是如果快速搜索是您的目标,按键搜索通常更快。
[运行示例] | [查看源代码] |
如同介绍中提到的,哈希表是一种集合。当填充哈希表时,为它提供一个要添加到表中的键,并提供伴随该键的值。在下面的示例中,雇员 ID 号用于键,然后是雇员姓名,以帮助您了解可使用的组合类型。注意键不要求是数值:任何对象都可接受。
哈希表为什么很有用?当向哈希表添加这些键-值对之一时,哈希表将查找该键并给它一个哈希代码,此代码是标识该键的数字(所添加的每个键都会得到一个哈希代码)。然后将这些哈希代码放入“存储桶”以帮助组织表中各项。这对以后尝试在表中进行查找时会有帮助。
暂时假想不用这些存储桶。如果想在数组中查找某元素,则必须遍历数组的每个元素来查找该元素。您不知道它在哪里,因此没有搜索各项的快速方法。相反,哈希表可以较快地搜索特定键,因为一旦为它提供了键,它便知道要在哪个存储桶中查找。这意味着它只须查找所有元素的一个子集。
有一点很重要,请记住这种较快的搜索机制仅当通过键搜索时可用。可以通过值搜索,但它可能要比键搜索慢。因此,如果可能则应执行键搜索。
若要向哈希表添加元素,请调用 Add 方法,传入要添加的键-值对。
// Here we'll create a hashtable of employee numbers and employee names Hashtable table = new Hashtable(); // now, we will add elements to the hashtable, as key-value pairs table.Add(5123, "Jay"); table.Add(1829, "Tom"); table.Add(2882, "Matt"); |
||
C# | VB |
现在已填充了哈希表,便可以在其中搜索元素了。将通过键和值进行搜索。注意在实际示例中,您将从用户处接受要查找的值或键,因此其实现略有不同,但概念相同。
// SEARCHING BY VALUE. Use the method ContainsValue String valueToFind = "Jay"; if (table.ContainsValue(valueToFind)) { Console.WriteLine("Found {0} in the list.", valueToFind ); } // SEARCHING BY KEY. Use the method Contains int keyToFind = 5123; if (table.Contains(keyToFind)) { Console.WriteLine("Found {0} in the list.", keyToFind); } |
||
C# | VB |
当然,您可以做的不仅仅是搜索。可以使用 Remove 方法从哈希表移除项(向该方法传递标识要移除的元素的键)。还可以使用哈希表实例内的"键"(Keys) 集合或"值"(Values) 集合来枚举哈希表。
// using the Remove method to delete a particular item... table.Remove(5123); // enumerating over the collection with a foreach statement // Note the alternate of iterating through by value is demonstrated // foreach (Object o in table.Values) { foreach (Object o in table.Keys) { Console.WriteLine(o.ToString()); } |
||
C# | VB |
这些是使用哈希表的基本操作。用项填充了哈希表以后,了解如何迭代通过哈希表很重要。此重要主题在如何迭代通过集合一节中讲述。下面的代码向您展示如何使用 Foreach(VB 中为 For Each)语句迭代通过列表,并向屏幕输出每个键-值组合。若要这样做,您还需要引用每个元素的 Key 和 Value 属性。下面的示例展示迭代通过集合。
// if you are wondering where DictionaryEntry comes from, it is // the generic object type of each element in the hashtable foreach (DictionaryEntry d in table) { // use the Key and Value properties Console.WriteLine ("{0}\t{1}", d.Key, d.Value); } |
||
C# | VB |