• 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]);
    排序后输出
     }

  • 相关阅读:
    PC software
    pdf.js查看器 在线预览 office文件、图片、文本文件
    核算两个时间之间时长
    Flink sql 之 join 与 StreamPhysicalJoinRule (源码解析)
    Flink sql 之 TopN 与 StreamPhysicalRankRule (源码解析)
    Flink Sql 之 Calcite Volcano优化器(源码解析)
    Keepalive高可用部署
    Keepalive配置文件
    Erlang环境安装
    ZooKeeper集群
  • 原文地址:https://www.cnblogs.com/gsk99/p/1904573.html
Copyright © 2020-2023  润新知