Dictionary、KeyValuePair、Hashtable的比较和使用

 

Dictionary

官方文档:http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

 

而Directory<T,T>是HashTable的泛型模式,用KeyValuePair<T,T>来遍历Directory<T,T>。

 

Dictionary泛型 中的任何键都必须是唯一的。键不能为空引用,但是如果值类型 TValue 为引用类型,该值则可以为空。

Dictionary 调用 Add 方法之前使用 ContainsKey 方法测试某个键是否存在,否则得到一个KeyNotFoundException。

if (!openWith.ContainsKey("ht"))
{
    openWith.Add("ht", "hypertrm.exe");
    Console.WriteLine("Value added for key = \"ht\": {0}",  openWith["ht"]);
}

当程序频繁尝试字典中不存在的键时,使用 TryGetValue 方法来检索值,这种方法是一种更有效的检索值的方法。

string value = "";
if (openWith.TryGetValue("tif", out value))
{
    Console.WriteLine("For key = \"tif\", value = {0}.", value);
}

测试键是否存在的最有效的方法

// The indexer throws an exception if the requested key is not in the dictionary.
try
{
    Console.WriteLine("For key = \"tif\", value = {0}.",    openWith["tif"]);
}
catch (KeyNotFoundException)
{
    Console.WriteLine("Key = \"tif\" is not found.");
}

相关文档:https://msdn.microsoft.com/zh-cn/library/kw5aaea4(v=vs.110).aspx

 

字典集合的两种遍历

Dictionary<string, string> dictionary = new Dictionary<string,string>();

foreach (string dic in dictionary.Keys)
{
    //Key: dic
    //Value: dictionary[dic]
}
foreach (KeyValuePair<string, string> dic in dictionary
{
    //Key: dic.Key
    //Value: dic.Value
}

KeyValuePair

结构体,定义可设置或检索的键/值对。

性能比自定义结构体查,可阅读:http://www.cnblogs.com/Artemisblog/p/3706054.html

示例

/// <summary>
/// 设置键/值对
/// </summary>
/// <returns></returns>
private KeyValuePair<int, string> SetKeyValuePair()
{
    int intKey = 1;
    string strValue = "My value";
    KeyValuePair<int, string> kvp = new KeyValuePair<int, string>(intKey, strValue);
    return kvp;
}
/// <summary>
/// 获得键/值对
/// </summary>
private void GetKeyValuePairDemo()
{
    KeyValuePair<int, string> kvp = SetKeyValuePair();
    int intKey = kvp.Key;
    string strValue = kvp.Value;
}

 

http://www.cnblogs.com/Artemisblog/p/3706054.html

http://www.cnblogs.com/KTblog/p/4392248.html

 

 

HashTable

描述

用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.

 Hashtable每个元素都是一个存储在 DictionaryEntry 对象中的键/值对。键不能为 空引用,但值可以。

二,哈希表的简单操作

Hashtable hshTable = new Hashtable(); //  创建哈希表
hshTable .Add("Person1",  "zhanghf");  //  往哈希表里添加键值对
hshTable .Clear();  //移除哈希表里所有的键值对
hshTable .Contains("Person1");   //判断哈希表里是否包含该键
string name = (string)hshTable["Person1"].ToString(); //取哈希表里指定键的值
hshTable.Remove("Person1"); //  删除哈希表里指定键的键值对

IDictionaryEnumerator en = hshTable.GetEnumerator();  //  遍历哈希表所有的键,读出相应的值
while (en.MoveNext())
{
     string str = en.Value.ToString();
}
// 循环hashtable
foreach (DictionaryEntry de in hshtable) {...}

 

可以使用Dictionary实现的时候,不要用哈希表。使用值类型时,它需要进行封箱和拆箱,耗费内存资源,效率比较低。

 

http://www.cnblogs.com/liuwenjun830/archive/2006/07/28/462182.html【推荐】

http://www.cnblogs.com/yangleiWPF/archive/2010/11/16/1878494.html

http://www.cnblogs.com/gjcn/archive/2008/07/07/1234560.html

 

 

 参考文章:

C#中Dictionary的用法【推荐】

http://jingyan.baidu.com/article/9989c7460ab872f648ecfeed.html

 

C#中键值对类型Hashtable与Dictionary比较和相关用法

http://www.2cto.com/kf/201304/201715.html

Hashtable与Dictionary虽然都是作为键值对的载体,但是采用的是不同的数据结构。就像Java中的ArrayList与LinkList,虽然都是实现了List接口作为集合载体,但其内部结构是不一样的,ArrayList是通过数组实现的,LinkList是通过对象链表实现的。

由于 Hashtable 和 Dictionary 同时存在, 在使用场景上必然存在选择性, 并不任何时刻都能相互替代.

[1] 单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
[2] 多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
[3] Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.

个人偏向于使用Dictionary,因为其使用泛型,可控性比较强。在一些资料中,很多人也推荐使用Dictionary,其原因主要有

1、Dic是类型安全的,这有助于我们写出更健壮更具可读性的代码,而且省却我们强制转化的麻烦。
2、Dic是泛行的,当K或V是值类型时,其速度远远超过Hashtable。处理对象时不需要进行显式或是隐式转型,进行值类型处理时不需要装箱。所以使用方便一些,而且效率会高一些(编码效率、运行效率),还不太容易出错。

 

 

 

 

 

时间: 2024-08-03 22:55:45

Dictionary、KeyValuePair、Hashtable的比较和使用的相关文章

浅谈Hashtable与Dictionary的异同

以前对于这两个集合类的认识只是停留在是否支持泛型上,这几天趁着看算法导论的机会,把两个类的内部的实现机制好好的了解了一下. Hashtable和Dictionary从数据结构上来说都属于Hashtable,都是对关键字(键值)进行散列操作,将关键字散列到Hashtable的某一个槽位中去,不同的是处理碰撞的方法.散列函数有可能将不同的关键字散列到Hashtable中的同一个槽中去,这个时候我们称发生了碰撞,为了将数据插入进去,我们需要另外的方法来解决这个问题. 链接法(chaining) 在链接

C#与数据结构--哈希表(Hashtable)

C#中实现了哈希表数据结构的集合类有: (1)System.Collections.Hashtable (2)System.Collections.Generic.Dictionary<TKey,TValue> 前者为一般类型的哈希表,后者是泛型版本的哈希表.Dictionary和Hashtable之间并非只是简单的泛型和非泛型的区别,两者使用了完全不同的哈希冲突解决办法.Dictionary我已经做了动态演示程序,使用的是Window应用程序.虽然Dictionary相对于Hashtable

Java Learn Steps

我个人的经验,学习java应分以下几个阶段: java的语法学习 面向对象观念的建立 java基本类库的学习 学习设计模式 应用设计模式 经过大量的实践,可以设计模式 以上六个阶段,其中前三个阶段是针对java的,但java中,在很多设计模式的应用,同时有很多功能都支持设计模式,所以不懂设计模式的人是不会很好的应用java做开发的.第4.5个阶段的学习在前三个阶段的基础上,学习.应用成功的经验.从而进入第六个阶段,在软件设计这个领域尽情发挥.本人受能力所限,还处在第4个阶段的学习过程,所以会对前

阿里JAVA开发面试常问问题总结

我的博客:CODE大全:www.codedq.net:业余草:www.xttblog.com:爱分享:www.ndislwf.com或ifxvn.com. 线程与进程进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和调度的基本单位.线程是操作系统进程中能够并发执行的实体,是处理器调度和分派的基本单位.每个进程内可包含多个可并发执行的线程.线程自己基本不拥有系统资源,只拥有少量必不可少的资源:程序计数器.一组寄存器.栈.同属一个进程的线程共享进程所拥有的主存空间和资源

Json.Net系列教程 2.Net类型与JSON的映射关系

原文 Json.Net系列教程 2.Net类型与JSON的映射关系 首先谢谢大家的支持和关注.本章主要介绍.Net类型与JSON是如何映射的.我们知道JSON中类型基本上有三种:值类型,数组和对象.而.Net中的类型比较多.到底它们是如何映射的呢? 总体来讲,Json.Net将.Net中的基本类型(int,float,string等)转换为Json的值,数组和集合转换为Json的数组,其它转换为Json对象. 1.基本类型: 2.复杂类型: 3.注意 3.1数组和集合 如果你自定义了实现了数组和

细说 ASP.NET Cache 及其高级用法

原文:细说 ASP.NET Cache 及其高级用法 许多做过程序性能优化的人,或者关注过程程序性能的人,应该都使用过各类缓存技术. 而我今天所说的Cache是专指ASP.NET的Cache,我们可以使用HttpRuntime.Cache访问到的那个Cache,而不是其它的缓存技术. 以前我在[我心目中的Asp.net核心对象] 这篇博客中简单地提过它,今天我打算为它写篇专题博客,专门来谈谈它,因为它实在是太重要了.在这篇博客中, 我不仅要介绍它的一些常见用法,还将介绍它的一些高级用法. 在上篇

C#数据绑定控件中的DataSource属性浅谈_实用技巧

有的时候,你在编程进入一定阶段,进一步提升很困难的境况之下,不妨回过头来看看基础的东西,或许你会有新的受益,或许能够真正的体会到孔夫子所谓的"温故而知新"的真正内涵.常用的C#数据绑定控件有:Repeater.DataList.GridView.DetailsView等,在这里我拿Repeater来简单说明问题.使用该属性指定用来填充Repeater控件的数据源.DataSource可以是任何System.Collections.IEnumerable对象,如用于访问数据库的Syste

CYQ.Data V5 MDataTable 专属篇介绍

前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分离和分布式缓存,这篇隆重地介绍一下:MDataTable,毕竟它有很多未公布或隐藏技能,值得一看. CYQ.Data 核心使用类介绍 常用: 1:操作数据库:MAction.MProc (名称空间:CYQ.Data) 2:日志操作:Log.SysLogs(名称空间:CYQ.Data) 3:配置和性能调试:Ap

.NET基础面试题整理

今年毕业,本学期找工作期间在面试前做的一些临时的准备 以下的关于老赵分享的面试题解答参考了手头的书籍和视频教程,以及网上的资料,现整理出来希望对大家有所帮助,不对或欠佳的地方望大家指出来我好改正.   1.什么是.NET?什么是CLI?什么是CLR?IL是什么?   (1).net用于代码编译和执行的集成托管环境,换句话,它管理应用程序运行的方方面面,包括首次运行的编译,为程序分配内存存储数据和指令,对于应用程序授予或拒绝相应的权限,并启动管理应用程序的执行,剩余内存的在分配.由于所有.net应