Hashtable 类

表示键/值对的集合,这些键/值对根据键的哈希代码进行组织。

命名空间:System.Collections
程序集:mscorlib(在 mscorlib.dll 中)

 

语法:

C#

[SerializableAttribute]

[ComVisibleAttribute(true)]

public class Hashtable : IDictionary, ICollection, IEnumerable,

        ISerializable, IDeserializationCallback, ICloneable

 

每个元素都是一个存储在 DictionaryEntry 对象中的键/值对。键不能为 空引用(在 Visual Basic 中为 Nothing),但值可以。

只要键对象用作 Hashtable 中的键,它们就必须是永远不变的。

当把某个元素添加到 Hashtable 时,将根据键的哈希代码将该元素放入存储桶中。该键的后续查找将使用键的哈希代码只在一个特定存储桶中搜索,这将大大减少为查找一个元素所需的键比较的次数。

Hashtable 的加载因子确定元素与存储桶的最大比率。加载因子越小,平均查找速度越快,但消耗的内存也增加。默认的加载因子 1.0 通常提供速度和大小之间的最佳平衡。当创建 Hashtable 时,也可以指定其他加载因子。

当向 Hashtable 添加元素时,Hashtable 的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable 中存储桶的数目自动增加到大于当前 Hashtable 存储桶数两倍的最小质数。

Hashtable 中的每个键对象必须提供其自己的哈希函数,可通过调用 GetHash 访问该函数。但是,可将任何实现 IHashCodeProvider 的对象传递到 Hashtable 构造函数,而且该哈希函数用于该表中的所有对象。

Hashtable 的容量是 Hashtable 可拥有的元素数。Hashtable 的默认初始容量为零。随着向 Hashtable 中添加元素,容量通过重新分配按需自动增加。

C# 语言中的 foreach 语句(在 Visual Basic 中为 for each)需要集合中每个元素的类型。由于 Hashtable 的每个元素都是一个键/值对,因此元素类型既不是键的类型,也不是值的类型。而是 DictionaryEntry 类型。例如:

C#

foreach (DictionaryEntry de in myHashtable) {...}

 

foreach 语句是对枚举数的包装,它只允许从集合中读取,不允许写入集合。

因为序列化和反序列化 Hashtable 的枚举数会使元素重新排序,所以不调用 Reset 方法就不能继续枚举。

下面的示例说明如何对 Hashtable 创建、初始化并执行各种函数以及如何打印出其键和值。

C#

using System;

using System.Collections;

 

class Example

{

    public static void Main()

    {

        // Create a new hash table.

        //

        Hashtable openWith = new Hashtable();

       

        // Add some elements to the hash table. There are no

        // duplicate keys, but some of the values are duplicates.

        openWith.Add("txt", "notepad.exe");

        openWith.Add("bmp", "paint.exe");

        openWith.Add("dib", "paint.exe");

        openWith.Add("rtf", "wordpad.exe");

       

        // The Add method throws an exception if the new key is

        // already in the hash table.

        try

        {

            openWith.Add("txt", "winword.exe");

        }

        catch

        {

            Console.WriteLine("An element with Key = \"txt\" already exists.");

        }

 

        // The Item property is the default property, so you

        // can omit its name when accessing elements.

        Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);

       

        // The default Item property can be used to change the value

        // associated with a key.

        openWith["rtf"] = "winword.exe";

        Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);

       

        // If a key does not exist, setting the default Item property

        // for that key adds a new key/value pair.

        openWith["doc"] = "winword.exe";

 

        // The default Item property throws an exception if the requested

        // key is not in the hash table.

        try

        {

            Console.WriteLine("For key = \"tif\", value = {0}.", openWith["tif"]);

        }

        catch

        {

            Console.WriteLine("Key = \"tif\" is not found.");

        }

 

        // ContainsKey can be used to test keys before inserting

        // them.

        if (!openWith.ContainsKey("ht"))

        {

            openWith.Add("ht", "hypertrm.exe");

            Console.WriteLine("Value added for key = \"ht\": {0}", openWith["ht"]);

        }

 

        // When you use foreach to enumerate hash table elements,

        // the elements are retrieved as KeyValuePair objects.

        Console.WriteLine();

        foreach( DictionaryEntry de in openWith )

        {

            Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);

        }

 

        // To get the values alone, use the Values property.

        ICollection valueColl = openWith.Values;

       

        // The elements of the ValueCollection are strongly typed

        // with the type that was specified for hash table values.

        Console.WriteLine();

        foreach( string s in valueColl )

        {

            Console.WriteLine("Value = {0}", s);

        }

 

        // To get the keys alone, use the Keys property.

        ICollection keyColl = openWith.Keys;

       

        // The elements of the KeyCollection are strongly typed

        // with the type that was specified for hash table keys.

        Console.WriteLine();

        foreach( string s in keyColl )

        {

            Console.WriteLine("Key = {0}", s);

        }

 

        // Use the Remove method to remove a key/value pair.

        Console.WriteLine("\nRemove(\"doc\")");

        openWith.Remove("doc");

       

        if (!openWith.ContainsKey("doc"))

        {

            Console.WriteLine("Key \"doc\" is not found.");

        }

    }

}

 

/* This code example produces the following output:

 

An element with Key = "txt" already exists.

For key = "rtf", value = wordpad.exe.

For key = "rtf", value = winword.exe.

For key = "tif", value = .

Value added for key = "ht": hypertrm.exe

 

Key = dib, Value = paint.exe

Key = txt, Value = notepad.exe

Key = ht, Value = hypertrm.exe

Key = bmp, Value = paint.exe

Key = rtf, Value = winword.exe

Key = doc, Value = winword.exe

 

Value = paint.exe

Value = notepad.exe

Value = hypertrm.exe

Value = paint.exe

Value = winword.exe

Value = winword.exe

 

Key = dib

Key = txt

Key = ht

Key = bmp

Key = rtf

Key = doc

 

Remove("doc")

Key "doc" is not found.

 */

 

HashTable的用法

,哈希表(Hashtable)简述

 .NET Framework中,HashtableSystem.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtablekeyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.

,哈希表的简单操作

 在哈希表中添加一个keyvalue键值对:HashtableObject.Add(key,value);
 
在哈希表中去除某个keyvalue键值对:HashtableObject.Remove(key);
 
从哈希表中移除所有元素:           HashtableObject.Clear();
 
判断哈希表是否包含特定键key      HashtableObject.Contains(key);
 
下面控制台程序将包含以上所有操作:
using System;
using System.Collections; file
使用Hashtable时,必须引入这个命名空间
class hashtable
{
  public static void Main()
  {
  Hashtable ht=new Hashtable(); file
创建一个Hashtable实例
  ht.Add(E,e);
添加keyvalue键值对
  ht.Add(A,a);
  ht.Add(C,c);
  ht.Add(B,b);

  string s=(string)ht[A];
  if(ht.Contains(E)) file
判断哈希表是否包含特定键,其返回值为truefalse
    Console.WriteLine(the E keyexist);
  ht.Remove(C);
移除一个keyvalue键值对
  Console.WriteLine(ht[A]);
此处输出a
  ht.Clear();
移除所有元素
  Console.WriteLine(ht[A]); file
此处将不会有任何输出
  }
}

,遍历哈希表

 遍历哈希表需要用到DictionaryEntry Object,代码如下:
 for(DictionaryEntry de in ht) fileht
为一个Hashtable实例
 {
   Console.WriteLine(de.Key);de.Key
对应于keyvalue键值对key
   Console.WriteLine(de.Value);de.Key
对应于keyvalue键值对value
 }

,对哈希表进行排序

 对哈希表进行排序在这里的定义是对keyvalue键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法:
 ArrayList akeys=new ArrayList(ht.Keys); file
别忘了导入System.Collections
 akeys.Sort(); file
按字母顺序进行排序
 for(string skey in akeys)
 {
   Console.Write(skey + );
   Console.WriteLine(ht[skey]);
排序后输出
 }

你可能感兴趣的:(Hashtable)