zoukankan      html  css  js  c++  java
  • 关于hashtable

    我以前常用:
     IDictionary<string,string> iDict和IList<FileInfo> dirList
    但是后来有高手说了要用hashtable据说性能比前两者好,那以后就用这hashtable吧
    呵呵,跟着大部队走...hashtable听起来也牛一些,
    就像人们比较:.net和JAVA的时候,人们往往都会说JAVA好,
    事事上JAVA工资也比.net高
    代码
    1、HashTable定义
    System.Collections. Hashtable类表示键
    /值对的集合,这些键/值对根据键的哈希代码进行组织, 每个元素都是一个存储在 DictionaryEntry 对象中的键/值对。键不能为 null,但值可以。

    2.优点
    1、通过Key快速查找。

    2、Hashtable 是线程安全的。

    3. Hashtable的构造器
    构造器函数
     注释
     
    Public Hashtable () 
     使用默认的初始容量(容量大小为0)、加载因子、哈希代码提供程序和比较器来初始化 Hashtable 类的新的空实例。
     
    public Hashtable (IDictionary) 
     通过将指定字典中的元素复制到新的 Hashtable 对象中,初始化 Hashtable 类的一个新实例。新 Hashtable 对象的初始容量等于复制的元素数,并且使用默认的加载因子、哈希代码提供程序和比较器。
     
    public Hashtable (Int32) 
     使用指定的初始容量、默认加载因子、默认哈希代码提供程序和默认比较器来初始化 Hashtable 类的新的空实例。
     

    4、Hashtable的属性
    属性名
     注释
     
    Count
     获取包含在 Hashtable 中的键
    /值对的数目。
     
    IsFixedSize
     获取一个值,该值指示 Hashtable 是否具有固定大小。
     
    IsReadOnly
     获取一个值,该值指示 Hashtable 是否为只读。
     
    Keys
     获取包含 Hashtable 中的键的 ICollection。
     
    Values
     获取包含 Hashtable 中的值的 ICollection。
     

    5. Hashtable的方法
    方法名
     注释
     
    Void Add(
    object key,object value)
     将带有指定键和值的元素添加到 Hashtable 中。
     
    Void Clear()
     从 Hashtable 中移除所有元素。
     
    Bool Contains(
    object key)
     确定 Hashtable 是否包含特定键。
     
    Bool ContainsKey(
    object key)
     确定 Hashtable 是否包含特定键。
     
    Bool ContainsValue(
    object value)
     确定 Hashtable 是否包含特定值。
     
    Void Remove(
    object key)
     从 Hashtable 中移除带有指定键的元素。
     
    Void InsertRange(
    int index,Icollection collec)
     用于从指定位置开始添加一批元素,列表后面的元素依次往后移动
     
    Clone()
     创建 Hashtable 的浅表副本。
     
    GetObjectData()
     实现 ISerializable 接口,并返回序列化 Hashtable 所需的数据。
     

     
    7、Hashtable遍历方法
    方法一

     
    foreach (System.Collections.DictionaryEntry objDE in objHasTab)
    {
    Console.WriteLine(objDE.Key.ToString());
    Console.WriteLine(objDE.Value.ToString());
    }

     

    方法二

    System.Collections.IDictionaryEnumerator enumerator 
    = objHashTablet.GetEnumerator(); 
    while (enumerator.MoveNext())
    {
    Console.WriteLine(enumerator.Key);         
    // Hashtable关健字
    Console.WriteLine

    }

    8、Hashtable排序
    //把ht的键对象全部复制到ArrayList中

     ArrayList al 
    = new ArrayList(ht.Keys);

     
    /*ht.Keys返回ht中所有键对象构成的集合,把该集合传递给ArrayList构造方法则得到一个包

    *所有键对象的动态数组

    */

      al.Sort();
    //从小到大排列

      
    //排序完成输出

       
    for (int i = 0; i < al.Count;i++ )

       {

              
    object e=al[i];

              
    object temp = (object)ht[e];//键作为索引器来获得对应的值对象

               Console.WriteLine(temp.tostring());

    }


    6、Hashtable的使用示例
     

    代码

     public class Program
        {
            public static void Main(string[] args)
            {
                //创建一个HashTable    
                Hashtable openWith = new Hashtable();
                //为HashTable添加元素,不能有重复的key,但可以有重复的值    
                openWith.Add("txt", "notepad.exe");
                openWith.Add("bmp", "paint.exe");
                openWith.Add("dib", "paint.exe");
                openWith.Add("rtf", "wordpad.exe");
                //添加重复的key,会抛出异常    
                try { openWith.Add("txt", "winword.exe"); }
                catch
                { Console.WriteLine("An element with Key = \"txt\" already exists."); }
                //通过key获得值 
                Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);
                //重新赋值     
                openWith["rtf"] = "winword.exe";
                Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);
                //以赋值的方式,创建一个新元素     
                openWith["doc"] = "winword.exe";
                //如果HashTable中不包含该元素,将抛出异常(经测试这里不抛出异常)  
                //原因(如果未找到指定的键,尝试获取它将返回 空引用(在 Visual Basic 中为 Nothing),尝试设置它将使用指定的键创建新元素。 )  
                try
                { Console.WriteLine("For key = \"tif\", value = {0}.", openWith["tif"]); }
                catch { Console.WriteLine("Key = \"tif\" is not found."); }
                //判断是否包含特定的key   
                if (!openWith.ContainsKey("ht"))
                {
                    openWith.Add("ht", "hypertrm.exe");
                    Console.WriteLine("Value added for key = \"ht\": {0}", openWith["ht"]);
                }
                //遍历HashTable       
                Console.WriteLine();
                foreach (DictionaryEntry de in openWith)
                { Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); }
                // 获取HashTable中值的集合   
                ICollection valueColl = openWith.Values;
                Console.WriteLine(); foreach (string s in valueColl)
                { Console.WriteLine("Value = {0}", s); }
                // 获取HashTable中键的集合     
                ICollection keyColl = openWith.Keys;
                Console.WriteLine();
                foreach (string s in keyColl)
                {
                    Console.WriteLine("Key = {0}", s);
                }
                Console.WriteLine("\nRemove(\"doc\")");
                //移除指定的元素       
                openWith.Remove("doc");
                if (!openWith.ContainsKey("doc"))
                {
                    Console.WriteLine("Key \"doc\" is not found.");
                }
                Hashtable mySourceHT = new Hashtable();
                mySourceHT.Add("A", "valueA");
                mySourceHT.Add("B", "valueB");
                // 创建一个字符串数组       
                String[] myTargetArray = new String[15];
                myTargetArray[0] = "The";
                myTargetArray[1] = "quick";
                myTargetArray[2] = "brown";
                myTargetArray[3] = "fox";
                myTargetArray[4] = "jumped";
                myTargetArray[5] = "over";
                myTargetArray[6] = "the";
                myTargetArray[7] = "lazy";
                myTargetArray[8] = "dog";
                // 遍历数组的值        
                Console.WriteLine("The target Array contains the following before:");
                PrintValues(myTargetArray, ' ');
                //将hashtable中的key复制到数组中         
                Console.WriteLine("After copying the keys, starting at index 6:");
                mySourceHT.Keys.CopyTo(myTargetArray, 6);
                PrintValues(myTargetArray, ' ');
                //将hashtable中的Value复制到数组中  
                Console.WriteLine("After copying the values, starting at index 6:");
                mySourceHT.Values.CopyTo(myTargetArray, 6);
                PrintValues(myTargetArray, ' '); Console.Read();
            }
            //遍历数据方法     
            public static void PrintValues(String[] myArr, char mySeparator)
            {
                for (int i = 0; i < myArr.Length; i++)
                    Console.Write("{0}{1}", mySeparator, myArr[i]);
                Console.WriteLine();
            }
        }


    -------长沙程序员技术交流QQ群:428755207-------
  • 相关阅读:
    ubuntu18.04LTS服务器用vituralenv安装和配置pytorch和tensorflow
    ubuntu18.04安装Anaconda
    XeLaTeX下如何以原大小显示PNG
    JS黑魔法之this, setTimeout/setInterval, arguments
    sicily 1198. Substring (递归全排列+排序)
    sicily 1046. Plane Spotting(排序求topN)
    sicily 1051. Biker's Trip Odomete
    sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)
    sicily 1035. DNA matching
    关于组织自定义皮肤/主题的一点思考
  • 原文地址:https://www.cnblogs.com/qq4004229/p/1818883.html
Copyright © 2011-2022 走看看