1. 本人C#程序菜鸟级别的存在,写博客一方面是为了知识的共享,另一方面也是为了督促自己;大神,可以忽略这篇文文的。废话到此......

哈希表是可以直接进行访问的数据结构,在形式上是类似字典的。不同的是,哈希表内的键值和关键字Key,类型是Object类型的。先说下百度上对哈希表的解释:

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。举个栗子:给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

1.哈希表的简单用法

在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,所以若文件使用Hashtable时,必须引入命名空间using System.Collections;

2.哈希表的基本操作[key代表键,value代表值]

添加一个键值对:   HashtableObject.Add(key,value);
移除某个键值对:   HashtableObject.Remove(key);
移除所有元素:       HashtableObject.Clear();
判断是否包含特定键:HashtableObject.Contains(key); 
创建哈希表实例: HashTable  ht = new Hashtable();

获取哈希表长度:实例.Count();

3.哈希表需要注意的简单点

当获取哈希表中数据时,如果类型声明的不对,会出现InvalidCastException错误:使用as语句避免错误;转换失败的情况,获取的值为NULL,但不会抛出错误。为防止转换不正确,也可以直接获取其object值,再做处理

4.遍历哈希表 需要用到DictionaryEntry Object;

栗子代码:

  1. 1 using System;
  2. 2 using System.Collections;
  3. 3 using System.Collections.Generic;
  4. 4 using System.Diagnostics;
  5. 5 using UnityEngine;
  6. 6
  7. 7 public class myHashTable : MonoBehaviour
  8. 8 {
  9. 9 private Hashtable ht;
  10. 10 void Start()
  11. 11 {
  12. 12 ht = new Hashtable(); //创建一个Hashtable实例
  13. 13 ht.Add("1", "Beijing");
  14. 14 ht.Add("2", "Shanghai");
  15. 15 ht.Add("3", "Chongqin");
  16. 16 ht.Add("4", 2); //使用多种数据类型
  17. 17 //Debug.LogError((string)ht["1"]);
  18. 18 // Debug.LogError(ht.Contains("4"));
  19. 19 //ht.Remove("4");
  20. 20 //ht.Clear();
  21. 21 // Debug.LogError(ht.Contains("2")) ;
  22. 22 //string a = ht["4"] as string;
  23. 23 //if (a == null)
  24. 24 // Debug.Log("a is null");
  25. 25 //Debug.Log(a);
  26. 26 foreach(DictionaryEntry de in ht)
  27. 27 {
  28. 28 Debug.Log(de.Key); //de.Key对应于keyvalue键值对key
  29. 29 Debug.Log(de.Value); //de.Key对应于keyvalue键值对value
  30. 30 }
  31. 31
  32. 32 //遍历键
  33. 33 foreach (string key in ht.Keys)
  34. 34 {
  35. 35 Debug.Log(key);//注意是String类型
  36. 36 }
  37. 37 foreach (DictionaryEntry de in ht)
  38. 38 {
  39. 39 int a =(int) de.Key ;
  40. 40 Debug.Log(a);
  41. 41 }
  42. 42 //遍历值 需要值是同一类型,否则报错:InvalidCastException: Cannot cast from source type to destination type.
  43. 43
  44. 44 foreach (string value in ht.Values)
  45. 45 {
  46. 46 Debug.Log(value);
  47. 47 }
  48. 48 ArrayList ak = new ArrayList(ht.Keys);
  49. 49 ak.Sort();
  50. 50 foreach (string a in ak)
  51. 51 {
  52. 52 Debug.Log(a,ht["a"] as UnityEngine.Object);
  53. 53 }
  54. 54
  55. 55
  56. 56 }
  57. 57
  58. 58 private void Awake()
  59. 59 {
  60. 60 Stopwatch sw = new Stopwatch();
  61. 61 List<int> a = new List<int>();
  62. 62 sw.Start();
  63. 63 for (int i = 0; i < 1000000; i++)
  64. 64 {
  65. 65 a.Add(i);
  66. 66 }
  67. 67 sw.Stop();
  68. 68 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//若循环次数较小,不建议使用sw.Elapsed,因为值可能就是0
  69. 69
  70. 70
  71. 71
  72. 72 Stopwatch sw = new Stopwatch();
  73. 73 Hashtable hashtable = new Hashtable();
  74. 74 Dictionary<string, int> dictionary = new Dictionary<string, int>();
  75. 75 int countNum = 1000000;
  76. 76
  77. 77 sw.Start();
  78. 78 for (int i = 0; i < countNum; i++)
  79. 79 {
  80. 80 hashtable.Add(i.ToString(), i);
  81. 81 }
  82. 82 sw.Stop();
  83. 84 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//692
  84. 85 sw.Start();
  85. 86 for (int i = 0; i < countNum; i++)
  86. 87 {
  87. 88 dictionary.Add(i.ToString(), i);
  88. 89 }
  89. 90 sw.Stop();
  90. 92 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//1262
  91. 93 sw.Start();
  92. 95 foreach (var i in hashtable)
  93. 96 {
  94. 97 hashtable.ContainsKey(i.ToString());
  95. 98 }
  96. 99 sw.Stop();
  97. 100
  98. 101 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//1723
  99. 102 sw.Start();
  100. 104 foreach(var i in dictionary)
  101. 105 {
  102. 106 dictionary.ContainsKey(i.ToString());
  103. 107 }
  104. 108 sw.Stop();
  105. 109 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//2230
  106. 110 }
  107. 111
  108. 112
  109. 113 }

  由上边的Awake函数内部运行的结果来看,Int型的数据,在添加的时候,字典是较快的;读取时,哈希表很快;不过之前有看到过其他人写的文章,说是string,Object类型的,它们在字典和哈希表的存取速度的比较,有兴趣的可以找找看下。

本人第一次写博客,难免有不足之处,希望大家批评指正,共同进步。

C# 哈希表HashTable的简单使用的更多相关文章

  1. 哈希表(hashtable)的javascript简单实现

    javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...

  2. 哈希表(Hashtable)简述

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...

  3. c/c++ 哈希表 hashtable

    c/c++ 哈希表 hashtable 概念:用key去查找value 实现hash函数有很多方法,本文用除留余数法. 除留余数法的概念: 取一个固定的基数的余数,注意不能用偶数,用偶数的话,分布会不 ...

  4. C#中哈希表(HashTable)的用法详解以及和Dictionary比较

    1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...

  5. Java中哈希表(Hashtable)是如何实现的

    Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...

  6. 转 C#中哈希表(HashTable)的用法详解

    看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...

  7. 数据结构---散列表查找(哈希表)概述和简单实现(Java)

    散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的key的对应f(key) ...

  8. [PHP] PHP数组的实现哈希表(HashTable)结构

    PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组.1.数据结构:保存哈希表容器,保存数据的容器2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中, ...

  9. 哈希表 HashTable(又名散列表)

    简介 其实通过标题上哈希表的英文名HashTable,我们就可以看出这是一个组合的数据结构Hash+Table. Hash是什么?它是一个函数,作用可以通过一个公式来表示: index = HashF ...

随机推荐

  1. urls.py的配置[路由配置]

    urls.py的配置[路由配置] Get请求与Post请求的方式 get请求: (1)地址栏输入url (2)<a href="请求url">点击</a> ...

  2. 转: 解压Assets.car (iOS加密资源)

    今天想获取APP的资源,但是查看xxx.app文件夹里面,缺少了大部分资源.在文件夹里面发现Assets.car这个文件,发现文件很大有40多M,猜想图片资源会不会被压缩到这里面了,所以就网络上查了下 ...

  3. bzoj4520【CQOI2016】K远点对

    题解: kd-tree裸题 对每个点维护最近的k个开个堆维护一下

  4. python之多线程 threading.Lock() 和 threading.RLock()

    0.目录 2. threading.Lock() 的必要性3.观察block4.threading.RLock() 的应用场景 1.参考 Thread Synchronization Mechanis ...

  5. LAMP编译安装部分

    # yum install -y apr-devel apr-util-devel pcre-devel # wget http://mirror.bit.edu.cn/apache/httpd/ht ...

  6. Python学习(九) —— 正则表达式与re模块

    一.正则表达式 定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正则表达 ...

  7. Codeforces 887D Ratings and Reality Shows

    Ratings and Reality Shows 参加talk show的时间肯定是在某个t[ i ]的后一秒, 枚举一下就好了. #include<bits/stdc++.h> #de ...

  8. 查看当前的app运行的是哪个Activity

    1.确认手机连接了adb-->检查方式:adb devices 2.手机运行任意app,随意进入一个页面 3.此时cmd运行:adb shell "dumpsys window | g ...

  9. 在 Wiki 标记中添加无序列表

    项目:在 Wiki 标记中添加无序列表在编辑一篇维基百科的文章时,你可以创建一个无序列表,即让每个列表项占据一行,并在前面放置一个星号.但是假设你有一个非常大的列表,希望添加前面的星号.你可以在每一行 ...

  10. Codeforces 862D. Mahmoud and Ehab and the binary string 【二分】(交互)

    <题目链接> 题目大意: 有一个长度为n(n<1000)的01串,该串中至少有一个0和一个1,现在由你构造出一些01串,进行询问,然后系统会给出你构造的串与原串的   Hamming ...