c#里的hashtable

return_name 2008-01-09 10:47:52
我刚刚接触c#啊,关于hashtable的问题我一直没怎么搞太明白。我知道它是键和值存放的。可就是不太明白具体意思,请大家用下面这个列子,帮我解释下。越详细越好啊.我也是搞不明白hashtable到底是怎么会事,写的有点乱。有会的给我介绍下。谢谢了。
hashtable booklist=new hashtable();
lei1 lei01=new lei1("vc",001);
lei1 lei02=new lei1("vb",002);
booklist.add(lei01.name,001);
booklist.add(lei02.isdn,002);
console.writeline(booklist[]);







class lei1
{ public string name;
public int isdn;
public lei(string x,int y)
{ name=x;
isdn=y;
}

}

















...全文
3203 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
soldier啥啥啥 2011-11-15
  • 打赏
  • 举报
回复
最好用泛型
iash123 2008-01-10
  • 打赏
  • 举报
回复
键值对应.应该是最好用的键值对应对象
Apollo_pl 2008-01-09
  • 打赏
  • 举报
回复
*小飞*
对的
zmaini1420 2008-01-09
  • 打赏
  • 举报
回复
UP!~~~
Zine_Alone 2008-01-09
  • 打赏
  • 举报
回复

Hashtable booklist=new Hashtable();
booklist.Add("vc",001);
booklist.Add("vb",002);





直接这样即可,HASHTABLE也是属于可变数组.当你要使用集合操作数据时,ARRYLIST,HASHTABLE,NameValueCollection都是不错的选择
fht123 2008-01-09
  • 打赏
  • 举报
回复
MSDN就是最好的注释
return_name 2008-01-09
  • 打赏
  • 举报
回复
能具体讲解一下么。我现在没条件看数据结构啊。最好针对我写的这个程序讲解一下,给我修改修改。。最好程序上加点注释
lovefootball 2008-01-09
  • 打赏
  • 举报
回复
现在已经不用Hashtable
用Dictionary,参考MSDN
http://msdn2.microsoft.com/zh-cn/library/xfhwa508(VS.80).aspx
vwxyzh 2008-01-09
  • 打赏
  • 举报
回复
看一下数据结构里面的哈希表,hashtable就是数据结构里面的哈希表的一个实现
阿非 2008-01-09
  • 打赏
  • 举报
回复
要学会看msdn
zmaini1420 2008-01-09
  • 打赏
  • 举报
回复
帮你顶下!~~~希望你早点解决!~
stning 2008-01-09
  • 打赏
  • 举报
回复
看15楼的就好了。。
DareDevillll 2008-01-09
  • 打赏
  • 举报
回复
现在都用字典泛型拉
zjl3396815 2008-01-09
  • 打赏
  • 举报
回复
c#HashTable类是字典的一种具体实现.
字典是一种群集类型,字典提供一种手段,让对象引用被存储时,同时存储一个唯一的查询键,这样,就可以用这个查询键来找到对象.
Q_282898034 2008-01-09
  • 打赏
  • 举报
回复
using System;
using System.Collections;

/* 哈希表简介
* 我不说些概念性的抽象知识,省得你晕
* Hashtable 类是 System.Collection 命名空间里定义的一个类
* 就像这个 ConsoleApplication78 命名空间里定义了类 lei1 一样
*
* 它内部有一个数组 bucket[] buckets,初始大小为 11(可修改),数组容量随着使用而增加,但容量一定是素数
* buckets 数组由 bucket 对象构成,bucket 类很小,很简单,只有三个成员变量
* int hash_coll; key 通过自身的 GetHashCode() 方法得到的哈希码,你不必关心它怎么算出来的,
* 只要知道不同的 key 有不同的哈希码,例如整数的哈希码等于自身的值
* 而 hash_coll 等于哈希码的低31位,只取低31位是因为第 32 位是标志位,另有他用
* 二进制比较糊涂的话,可以假设 hash_coll 值就是哈希码值,大多数情况是这样
* object key; 用户传入的键,装箱或转换为 object 对象存放在这个变量里
* object val; 用户跟键一起传入的值,装箱或转换为 object 对象存放
*
* 当用户存入键和值的时候,程序会根据key计算 hash_coll,并将 hash_coll,key,val 组成 bucket 对象,存入数组 buckets。
*
* 问题之一: 11个元素的数组,当前 bucket 对象应该存入那个元素?
* 答: 根据 hash_coll 与数组容量 11 的余数来定位。例如 key 是整数 22,hash_coll = 22,22 % 11 = 0,所以存入 buckets[0]
* 问题之二: 余数冲突怎么办?例如 hash_coll 等于 0 或 22 时,余数都是 0
* 答: 容量不到 8 个是不会改变 11 这个容量的(默认 72% 是界限,可修改),遇到这种余数定位冲突,有个解决方法
* hash_coll 是个 32 位数字,最高位专门拿出来做标志位,说明当前 buckets 数组元素是否曾遇到过冲突的情况
* 这里我们先存入 key = 22 的,后存入 key = 0 的。发生冲突了 buckets[0] 的 hash_coll 最高位变为 1。
* 同时 key = 0 的 bucket 对象无法存入 buckets[0],而存入了 buckets[2],偏移量 2 是根据 key = 0 算出来的,这里不详述。
* 问题之三: 怎么提取已存入的元素?
* 答: 例如上述 0 和 22,提取的时候先计算余数,余数指向 buckets[0],找到 buckets[0] 的 key 进行比较是否相等,
* 如果提取 key = 22 的话,这就成了。如果提取 key = 0 的话,key 不相等,这时判断如果 buckets[0] 曾经冲突过,
* 就根据 0 算出偏移量 2,然后寻找 buckets[2],判断 key 相等,完成。如果不相等并且有冲突,还可以寻找 buckets[4]...
* 问题之四: 这种机制的好处?
* 答: 哈希表主要用于查找,理想情况下哈希表没有冲突,根据 key 第一时间找到值,就像数组一样,例如上述依次存入 key 为 0 到 6 的键/值对的情况。
* 但容量设为 11 等小数字,就会造成了冲突的发生,存入和提取键/值对都要多次寻址,但相对于节省的空间来说,很上算了,因为冲突概率较小
* 注意: 自定义类要重写GetHashCode()方法才能用作key存入哈希表,否则可能会造成哈希表key崩溃。
* 重写GetHashCode()方法后,必须同步重写Equals()方法。使哈希码相等条件和自定义类相等条件相同,否则也会有可能造成哈希表key崩溃。
*/
namespace ConsoleApplication78
{
class Program
{
static void Main()
{
// 初始化一个哈希表对象 booklist
Hashtable booklist = new Hashtable();

// 生成两个对象
lei1 lei01 = new lei1("vc", 001);
lei1 lei02 = new lei1("vb", 002);

// key最好是同一类型的值,否则有可能造成key崩溃
booklist.Add(001,lei01.name);
booklist.Add(002,lei02.isdn);

// 要输出全部值,最好这么写
foreach (DictionaryEntry d in booklist)
Console.WriteLine(d.Value);
}
class lei1
{
public string name;
public int isdn;
public lei1(string x, int y)
{
name = x;
isdn = y;
}
}
}
}

// 我曾经编写过仿微软 Hashtable 的源代码,使根据微软源码反编译后写成的。
// 下载:http://download.csdn.net/source/305015
// 讨论:http://topic.csdn.net/u/20071209/17/0129568b-30d1-4c87-aaa2-804b8b2bacf6.html
changjiangzhibin 2008-01-09
  • 打赏
  • 举报
回复
容量较大时,用它效率较高,写一点代码,希望对LZ有帮助
HashTable ht = new HashTable();
ht.Add("01","tom");
ht.Add("02","mike");
ht.Add("03","jerry");
ArrayList arr = new ArrayList();
foreach(string key in ht.Keys)
{
//string name = ht[key].ToString();
arr.Add(ht[key].ToString());
}
wygyhm 2008-01-09
  • 打赏
  • 举报
回复
  与集合、数组在本质上差不多,不过它是以自己定义的键(可以是多种数据类型)来访问值,而不是用索引。
songxiaozhao 2008-01-09
  • 打赏
  • 举报
回复
这么理解,有一个书架子,你要往上面放书,为了能够快速找到你要看的书,那么放的时候应该给每本书标上标签,例如"vc","vb"等等,这些标签就是键,每本书就是值
hashtable booklist=new hashtable();
booklist.add("vc",book1);
booklist.add("vb",book2);
hehou 2008-01-09
  • 打赏
  • 举报
回复
最简单的回答:接分.
你己知道了答案,KEY=VALUE.一对一的关系.不需要别人去解释,你想想我现在要做什么我去拿他来实现你的目标.关键是你的工程需要
chxzll 2008-01-09
  • 打赏
  • 举报
回复
HashTable是一个集合,所谓集合就是一个容器,可以放置元素,在HashTable中的元素是以键-值对的形式来存储的,如果读取HashTable的中元素,是通过键去读取值.
//实例化HashTable,相当于容器已经准备好的,可以向其中放置元素了
HashTable booklist=new HashTable();

//要放的数据是对象,所以先进行实例化
lei1 lei01=new lei1("vc",1);
lei1 lei02=new lei1("vb",2);

//向HashTable中添加元素,isdn属性作为键,类似于数据库中的表格,都有一个主键列,根据主键列去访问整条记录
//以下操作相当于在表格中加了两行数据,数据是以isdn的值标识
booklist.add(lei01.isdn,lei01);
booklist.add(lei02.isdn,lei02);

//booklist[1]得到键为1的lei01对象
//在HashTable中数据是以object形式存储的,所以需要强制类型转换为lei01类型
//取出键为1的元素后,得到该对象的name属性的值
Console.WriteLine(((lei1)booklist[1]).name);

class lei1
{ public string name;
public int isdn;
public lei(string x,int y)
{ name=x;
isdn=y;
}

}
加载更多回复(2)
课程总体目标:     本中级篇面向的学员不再是完全的编程“小白”,而是具备一定C#编程经验,需要进一步查漏补缺、或者需要进一步全面完善自己C#编程知识体系的广大Unity学员。相信通过本中级篇的学习,可以使得Unity初中级开发人员对于编程语言的掌握更进一步;对于开发中大型游戏项目,在编程语言这一层级进一步打下坚实的语言基础。 “中级篇”课程讲解特点:       本中级篇面向初中级游戏研发人员,以及Unity中高级学习者。为了更加深入的刨析各个语法的本质,我们采用反编译解读IL中间语言的方式,来解构语法难点,使得学员最短时间掌握语法本质。 本课程讲解内容:       C#(for Unity)中级篇 在“C#入门”、“基础篇”的基础之上,从以下四个方面着重研究我们游戏开发(包含软件开发)过程中,C#最重要、最实用的技能模块,使得广大游戏研发人员,对于C#这门Unity脚本有进一步更加完善的认识。一:.Net 框架讲解。    A) .Net 发展历史。    B)  IL  中间语言。 CLR  公共语言运行时。    C) 多维数据(常用二维数组)与交错数组。    D) 可变参数 Params    E) 进一步解释“实参”,“形参”。    F) 类的实例化内存分配机制。二:深入学习对象类型    A)  氏替换原则(LSP)    B)  类的属性极其本质特性    C)  IS ,AS 关键字    D)  深入学习字符串理论        1] 字符串的“驻留性” 原理。        2] 字符串==与Equals() 的本质区别        3] 更多字符串常用方法学习。    E)  枚举类型以及适用场合。三:深入学习集合特性    A)  什么是索引器,以及索引器的适用范围。    B)  学习自定义集合类,以及深入了解Foreach 语句的原理。    C)  深入学习 ArrayList,了解内部存储机制以及原理。    D)  深入学习 HashTable,了解内部存储机制以及原理。    E)  为什么学习泛型集合?    F)  泛型集合与普通集合的性能测试对比实验。    G)  学习“泛型约束”,以及“泛型约束”的适用条件。四:委托与事件        A)  什么是委托,先从讲故事学习起:“老板来啦”!    B)  反编译掌握委托的本质。    C)  委托的四大开发步骤。    D)  什么是事件,以及委托与事件的区别。    E)  事件的常用使用方式。 温馨提示:       本C# for Unity 使用Virtual Studio2012,进行开发与讲解。(学员使用更高版本,对学习没有任何影响) 一、热更新系列(技术含量:中高级):A:《lua热更新技术中级篇》https://edu.csdn.net/course/detail/27087B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136二:框架设计系列(技术含量:中级): A:《游戏UI界面框架设计系列视频课程》https://edu.csdn.net/course/detail/27142B:《Unity客户端框架设计PureMVC篇视频课程(上)》https://edu.csdn.net/course/detail/27172C:《Unity客户端框架设计PureMVC篇视频课程(下)》https://edu.csdn.net/course/detail/27173D:《AssetBundle框架设计_框架篇视频课程》https://edu.csdn.net/course/detail/27169三、Unity脚本从入门到精通(技术含量:初级)A:《C# For Unity系列之入门篇》https://edu.csdn.net/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.csdn.net/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.csdn.net/course/detail/24422D:《C# For Unity系列之进阶篇》https://edu.csdn.net/course/detail/24465四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)A:《虚拟现实之汽车仿真模拟系统 》https://edu.csdn.net/course/detail/26618五、Unity基础课程系列(技术含量:初级) A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》 https://edu.csdn.net/course/detail/24643B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》https://edu.csdn.net/course/detail/24645 C:《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096六、Unity ARPG课程(技术含量:初中级):A:《MMOARPG地下守护神_单机版实战视频课程(上部)》https://edu.csdn.net/course/detail/24965B:《MMOARPG地下守护神_单机版实战视频课程(中部)》https://edu.csdn.net/course/detail/24968C:《MMOARPG地下守护神_单机版实战视频课程(下部)》https://edu.csdn.net/course/detail/24979

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧