C# 哈希表HashTable的简单使用
本人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 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Diagnostics;
5 using UnityEngine;
6
7 public class myHashTable : MonoBehaviour
8 {
9 private Hashtable ht;
10 void Start()
11 {
12 ht = new Hashtable(); //创建一个Hashtable实例
13 ht.Add("1", "Beijing");
14 ht.Add("2", "Shanghai");
15 ht.Add("3", "Chongqin");
16 ht.Add("4", 2); //使用多种数据类型
17 //Debug.LogError((string)ht["1"]);
18 // Debug.LogError(ht.Contains("4"));
19 //ht.Remove("4");
20 //ht.Clear();
21 // Debug.LogError(ht.Contains("2")) ;
22 //string a = ht["4"] as string;
23 //if (a == null)
24 // Debug.Log("a is null");
25 //Debug.Log(a);
26 foreach(DictionaryEntry de in ht)
27 {
28 Debug.Log(de.Key); //de.Key对应于keyvalue键值对key
29 Debug.Log(de.Value); //de.Key对应于keyvalue键值对value
30 }
31
32 //遍历键
33 foreach (string key in ht.Keys)
34 {
35 Debug.Log(key);//注意是String类型
36 }
37 foreach (DictionaryEntry de in ht)
38 {
39 int a =(int) de.Key ;
40 Debug.Log(a);
41 }
42 //遍历值 需要值是同一类型,否则报错:InvalidCastException: Cannot cast from source type to destination type.
43
44 foreach (string value in ht.Values)
45 {
46 Debug.Log(value);
47 }
48 ArrayList ak = new ArrayList(ht.Keys);
49 ak.Sort();
50 foreach (string a in ak)
51 {
52 Debug.Log(a,ht["a"] as UnityEngine.Object);
53 }
54
55
56 }
57
58 private void Awake()
59 {
60 Stopwatch sw = new Stopwatch();
61 List<int> a = new List<int>();
62 sw.Start();
63 for (int i = 0; i < 1000000; i++)
64 {
65 a.Add(i);
66 }
67 sw.Stop();
68 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//若循环次数较小,不建议使用sw.Elapsed,因为值可能就是0
69
70
71
72 Stopwatch sw = new Stopwatch();
73 Hashtable hashtable = new Hashtable();
74 Dictionary<string, int> dictionary = new Dictionary<string, int>();
75 int countNum = 1000000;
76
77 sw.Start();
78 for (int i = 0; i < countNum; i++)
79 {
80 hashtable.Add(i.ToString(), i);
81 }
82 sw.Stop();
84 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//692
85 sw.Start();
86 for (int i = 0; i < countNum; i++)
87 {
88 dictionary.Add(i.ToString(), i);
89 }
90 sw.Stop();
92 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//1262
93 sw.Start();
95 foreach (var i in hashtable)
96 {
97 hashtable.ContainsKey(i.ToString());
98 }
99 sw.Stop();
100
101 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//1723
102 sw.Start();
104 foreach(var i in dictionary)
105 {
106 dictionary.ContainsKey(i.ToString());
107 }
108 sw.Stop();
109 UnityEngine.Debug.Log(sw.ElapsedMilliseconds);//2230
110 }
111
112
113 }
由上边的Awake函数内部运行的结果来看,Int型的数据,在添加的时候,字典是较快的;读取时,哈希表很快;不过之前有看到过其他人写的文章,说是string,Object类型的,它们在字典和哈希表的存取速度的比较,有兴趣的可以找找看下。
本人第一次写博客,难免有不足之处,希望大家批评指正,共同进步。
C# 哈希表HashTable的简单使用的更多相关文章
- 哈希表(hashtable)的javascript简单实现
		
javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...
 - 哈希表(Hashtable)简述
		
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...
 - c/c++ 哈希表 hashtable
		
c/c++ 哈希表 hashtable 概念:用key去查找value 实现hash函数有很多方法,本文用除留余数法. 除留余数法的概念: 取一个固定的基数的余数,注意不能用偶数,用偶数的话,分布会不 ...
 - C#中哈希表(HashTable)的用法详解以及和Dictionary比较
		
1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...
 - Java中哈希表(Hashtable)是如何实现的
		
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
 - 转 C#中哈希表(HashTable)的用法详解
		
看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...
 - 数据结构---散列表查找(哈希表)概述和简单实现(Java)
		
散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的key的对应f(key) ...
 - [PHP] PHP数组的实现哈希表(HashTable)结构
		
PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组.1.数据结构:保存哈希表容器,保存数据的容器2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中, ...
 - 哈希表 HashTable(又名散列表)
		
简介 其实通过标题上哈希表的英文名HashTable,我们就可以看出这是一个组合的数据结构Hash+Table. Hash是什么?它是一个函数,作用可以通过一个公式来表示: index = HashF ...
 
随机推荐
- SQLServer锁的基础问题探究
			
SqlServer需要在执行操作前对目标资源获取所有权,那么久发生锁定,是一个逻辑概念.为了保证事务的ACID特性设计的一种机制. 在多用户并发操作数据时,为了出现不一致的数据,锁定是必须的机制.使用 ...
 - tornado中form表单验证详解
			
#!/usr/bin/env python# _*_ coding:utf-8 _*_import tornado.webimport tornado.ioloopimport re class Ba ...
 - Java面向对象三大特性
			
封装.继承.多态. 1.封装 封装就是将对象的属性和行为特征包装到一个程序单元(即类)中,把实现细节隐藏起来,通过公用的方法来展现类对外提供的功能,提高了类的内聚性,降低了对象之间的耦合性. 2.继承 ...
 - linux下几个常用软件
			
Ubuntu 软件包地址 https://packages.ubuntu.com/ 一. 字体 不管是雅黑还是宋体,从windows cp过来后, 直接双击打开并安装 二. Meld 可视的diff和 ...
 - 3. 深入研究 UCenter API 之 加密与解密(转载)
			
1. 深入研究 UCenter API 之 开篇 (转载) 2. 深入研究 UCenter API 之 通讯原理(转载) 3. 深入研究 UCenter API 之 加密与解密(转载) 4. ...
 - 一起学Hadoop——二次排序算法的实现
			
二次排序,从字面上可以理解为在对key排序的基础上对key所对应的值value排序,也叫辅助排序.一般情况下,MapReduce框架只对key排序,而不对key所对应的值排序,因此value的排序经常 ...
 - JMeter上传案例2
			
今天自己的QQ群里有个朋友一直在问JMeter图片上传的问题 原始通过JMeter抓包如下: 参考: http://blog.csdn.net/huashao0602/article/details/ ...
 - seafile数据的备份与恢复
			
seafile数据备份包括MySQL数据备份与seafile,seahub数据备份两个部分.所以在备份的时候需要注意这一点. 我的存储底层用glusterfs数据共享,为了防止一台服务器宕机以后另一台 ...
 - 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)
			
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...
 - 035 控制并发 select * from test1 where id =1 for update 就会对这行加锁了?
			
今天在看同事程序的时候,看到这种用法,顺便学习下. 一:理论 1.功能 这个功能是上锁. 上的是一个排它锁,也就是说,其他的事务是可以读取的.但是不能写入或者更新. 二:实践 1.创建表 2.提交一条 ...