知识大全 Hashtable Dictionary的使用
Posted 函数
篇首语:夏天就不会生长,春天不播种。秋天就不能收割,冬天就不能品尝。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hashtable Dictionary的使用相关的知识,希望对你有一定的参考价值。
Hashtable Dictionary的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
要了解C#中Hashtable Dictionary的使用 我们先来看一个例子!
using System;
using System Collections;
namespace NoSortHashtable
/// <summary>
/// Summary description for Class
/// </summary>
class Class
/// <summary>
/// The main entry point for the application
/// </summary>
[STAThread]
static void Main(string[] args)
Hashtable hashTable = new Hashtable();
hashTable Add(\\ hunan\\ \\ changsha\\ );
hashTable Add(\\ beijing\\ \\ beijing\\ );
hashTable Add(\\ anhui\\ \\ hefei\\ );
hashTable Add(\\ sichuan\\ \\ chengdu\\ );
foreach(string str in hashTable Keys)
Console WriteLine(str + \\ : \\ + hashTable[str]);
打印的结果是
anhui : hefei
hunan : changsha
sichuan : chengdu
beijing : beijing
为何产生这样的结果? 我查了MSDN后发现
Hashtable 对象由包含集合元素的存储桶组成 存储桶是 Hashtable 中各元素的虚拟子组 与大多数集合中进行的搜索和检索相比 存储桶可令搜索和检索更为便捷 每一存储桶都与一个哈希代码关联 该哈希代码是使用哈希函数生成的并基于该元素的键 [Page]
哈希函数是基于键返回数值哈希代码的算法 键是正被存储的对象的某一属性的值 哈希函数必须始终为相同的键返回相同的哈希代码 一个哈希函数能够为两个不同的键生成相同的哈希代码 但从哈希表检索元素时 为每一唯一键生成唯一哈希代码的哈希函数将令性能更佳
在 Hashtable 中用作元素的每一对象必须能够使用 GetHashCode 方法的实现为其自身生成哈希代码 但是 还可以通过使用接受 IHashCodeProvider 实现作为参数之一的 Hashtable 构造函数 为 Hashtable 中的所有元素指定一个哈希函数
在将一个对象添加到 Hashtable 时 它被存储在存储桶中 该存储桶与匹配该对象的哈希代码的哈希代码关联 在 Hashtable 内搜索一个值时 将为该值生成哈希代码 并且搜索与该哈希代码关联的存储桶
例如 一个字符串的哈希函数可以采用该字符串中每一字符的 ASCII 代码并它们添加到一起来生成一个哈希代码 字符串 picnic 将具有与字符串 basket 的哈希代码不同的哈希代码 因此 字符串 picnic 和 basket 将处于不同的存储桶中 与之相比 stressed 和 desserts 将具有相同的哈希代码并将处于相同的存储桶中
Dictionary 类与 Hashtable 类的功能相同 对于值类型 特定类型(不包括 Object)的 Dictionary 的性能优于 Hashtable 这是因为 Hashtable 的元素属于 Object 类型 所以在存储或检索值类型时通常发生装箱和取消装箱操作 中国自学编程网
产生这个结果的原因就是Hashtable内部的排序机制使然 但我现在就是不想排序 我按什么顺序输入的 就想它再怎么给我输出 怎么办?
google后发现几个可以解决的办法 不过都需要自己写代码实现
比如 继承hashtable 使用不自动排序的arraylist做中间桥
using System;
using System Collections;
namespace NoSortHashtable
public class NoSortHashtable : Hashtable
private ArrayList keys = new ArrayList();
public NoSortHashtable()
public override void Add(object key object value)
base Add (key value);
keys Add (key); [Page]
public override ICollection Keys
get
return keys;
public override void Clear()
base Clear ();
keys Clear ();
public override void Remove(object key)
base Remove (key);
keys Remove (key);
public override IDictionaryEnumerator GetEnumerator()
return base GetEnumerator ();
或者
只要Compare函数的返回结果不等于 就可以添加相同的Key 这样可以实现既可以排序 又可以有相同的Key值 可能在某些情况下会用得到
using System;
using System Collections;
namespace testSortedList
class Class
[STAThread]
static void Main(string[] args)
SortedList sl = new SortedList(new MySort()); //不排序 [Page]
sl Add( );
sl Add( );
sl Add( );
sl Add( );
PrintList(sl);
Console ReadLine();
private static void PrintList(SortedList sl)
for(int i= ;i<sl Count ;i++)
Console WriteLine(\\ \\\\t \\ sl GetKey(i) sl GetByIndex(i));
//end for
//end fn()
public class MySort:IComparer
#region IComparer 成员
public int Compare(object x object y)
return ;
//排序
// int iResult = (int)x (int)y;
// if(iResult == ) iResult = ;
// return iResult;
#endregion
使用单链接列表实现 IDictionary 建议用于通常包含 个或 个以下项的集合
最后我测试了使用泛类型的Dictionary<T T> 尽管msdn上说hashtable和Dictionary的实现是一样的 不过同样的数据 返回的结果却是不同的 我没有找到更多的解释 测试代码如下 [Page]
using System;
using System Collections;
using System Collections Specialized;
using System Collections Generic;
namespace NoSortHashtable
/// <summary>
/// Summary description for Class
/// </summary>
public class Class
/// <summary>
/// The main entry point for the application
/// </summary>
[STAThread]
static void Main(string[] args)
Hashtable ht = new Hashtable();
ht Add(\\ hunan\\ \\ changsha\\ );
ht Add(\\ beijing\\ \\ beijing\\ );
ht Add(\\ anhui\\ \\ hefei\\ );
ht Add(\\ sichuan\\ \\ chengdu\\ );
foreach(string str in ht Keys)
Console WriteLine(str + \\ : \\ + ht[str]);
Console WriteLine(\\ \\ );
Dictionary<String String> dic = new Dictionary<String String>();
dic Add(\\ hunan\\ \\ changsha\\ ); [Page]
dic Add(\\ beijing\\ \\ beijing\\ );
dic Add(\\ anhui\\ \\ hefei\\ );
dic Add(\\ sichuan\\ \\ chengdu\\ );
foreach(string str in dic Keys)
Console WriteLine(str + \\ : \\ + dic[str]);
Console WriteLine(\\ \\ );
ListDictionary lsdic = new ListDictionary();
lsdic Add(\\ hunan\\ \\ changsha\\ );
lsdic Add(\\ beijing\\ \\ beijing\\ );
lsdic Add(\\ anhui\\ \\ hefei\\ );
lsdic Add(\\ sichuan\\ \\ chengdu\\ );
foreach(string str in lsdic Keys)
Console WriteLine(str + \\ : \\ + lsdic[str]);
cha138/Article/program/ASP/201311/21738
相关参考
HashTable类 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! //HashTable类表示
哈希表(HashTable) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! HashTable通
hashTable和hashMap的不同 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Hash
利用Session和HashTable制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
C#中HashTable简介和使用用法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一简介
在C#中应用哈希表(Hashtable) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一哈希表
在main()中每次产生一个随机数字它都会封装到一个Integer对象里使句柄能够随同散列表一起使用(不可对一个集合使用基本数据类型只能使用对象句柄)containKey()方法检查这个键是否已经
这道题有多种算法算法把第一个链表逐项存在hashtable中遍历第个链表的每一项如果能在第一个链表中找到则必然相交staticboolJudgeIntersectLink(LinkheadLinkhe
知识大全 小明管小明叔叔的儿子的叔叔的叔叔的儿子的叔叔的哥哥的哥哥的姐姐的妹妹的弟弟的哥哥的爸爸叫什么
小明管小明叔叔的儿子的叔叔的叔叔的儿子的叔叔的哥哥的哥哥的姐姐的妹妹的弟弟的哥哥的爸爸叫什么?太爷~你的爸爸的爷爷的爸爸的儿子的女儿的儿子的舅舅是谁?你的爸爸的爷爷的爸爸是曾曾曾祖父你的爸爸的爷爷的爸
知识大全 智力测试:小花哥哥的妈妈的儿子的妹妹的儿子的外婆的儿子的爸爸的女儿的妈妈的哥哥的儿子的爷爷叫什么
智力测试:小花哥哥的妈妈的儿子的妹妹的儿子的外婆的儿子的爸爸的女儿的妈妈的哥哥的儿子的爷爷叫什么?北方叫姥爷,南方叫外公采纳哦白勺的的的组词的确díquè完全确实;实在:他~是这样说的ㄧ这的的确确是宋