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


最近在使用C#中的Hashtable与Dictionary的时候,想知道其区别,通过查找网络相关博客资料,作出下列总结。

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。处理对象时不需要进行显式或是隐式转型,进行值类型处理时不需要装箱。所以使用方便一些,而且效率会高一些(编码效率、运行效率),还不太容易出错。

Dictionary 调用 Add 方法之前使用 ContainsKey 方法测试某个键是否存在,否则得到一个KeyNotFoundException。当程序频繁尝试字典中不存在的键时,使用 TryGetValue 方法来检索值,这种方法是一种更有效的检索值的方法。

下面是对于Dictionary的一些常用的操作,包括遍历,添加,删除等

[csharp]
Dictionary<int, string> dictionary = new Dictionary<int, string>();   
dictionary.Add(1, "xiaowang");   
dictionary.Add(21, "dsd");   
dictionary.Add(33, "dsfdfd");   
dictionary.Add(4, "liusang");    
   
foreach (KeyValuePair<int, string> kvp in dictionary)   
{   
    Console.WriteLine("key={0},value={1}", kvp.Key, kvp.Value);   
}    
   
foreach (int j in dictionary.Keys)   
{   
    Console.WriteLine("key={0},value={1}", j, dictionary[j]);   
}    
if (dictionary.ContainsKey(2))      
{      
    Console.WriteLine(dict[2]);      
 }      
 //遍历Keys       
foreach (var item in dictionary.Keys) 
{      
    Console.WriteLine("Key:{0}", item);      
}      
 //遍历Values       
foreach (var item in dictionary.Values)      
{      
   Console.WriteLine("value:{0}", item);      
}      
<BR>

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

时间: 2024-10-07 20:15:54

(转)C#中键值对类型Hashtable与Dictionary比较和相关用法的相关文章

python字典中键值对的值为中文,打印成转义字符,怎么解决

今天是2019-10-02,学习代码第二天. python字典中键值对中有中文,打印的时候,发现成转义字符了.查了好久,解决.记录一下.useful. 今日份代码: 1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 # 字典和列表的区别 4 # 列表是有序的对象集合,字典是无序的对象集合 5 # 字典的特点,字典用{}定义,使用键值对存储数据,键值对间用,分开 6 # 键--key,索引 值--value,数据 键和值间用:分开 键--唯一的,只能取字

ios中键值编码kvc和键值监听kvo的特性及详解

总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  3. 动态设置:setValue:属性值 forKey:属性名(用于简单的路径)/setValue:属性值 forKeyPath:属性名(用于复杂的路径)kvo键值监听  永久性的监听item属性值的改变,如果改变就从新设置             1.监听方法:[addObserver:self

smarty中ifelse、foreach以及获取数组中键值名的一个实例

<{if empty($history)}> <tr> <td colspan="6">Not any records!</td> </tr> <{else}> <{foreach from=$history item=item}> <tr> <td><{$item.id}></td> <td> <div style="max-

前端发键值对类型的list给后端

前端数据格式: {"weather":"1","data":["0","1"]} json格式  数据是list  包含两个键值对   第一个元素是String,String. 第二个元素是String,Array 比如这些数据  用对象params指向这个list 第一步 data:JSON.stringify(params)   //JSON.stringify()  把对象转换为JSON格式 第二步

Unity3d 中键值监听方法

unity3d的api中没有负责监听键值的方法,不过unity的input类是通过c#类获取各类监听事件,所以我们可以通过c#类监听,方法如下: void OnGUI() { Event e = Event.current; if (e.isKey) { if (Event.current.keyCode == KeyCode.Joystick2Button0){ //你的逻辑} } } 过程很简单,就不多说,注意该事件只能在OnGUI函数中起作用. 转载请标明出处,from 博客园 HemJo

IOS开发info.plist中键值的含义

1.     Application does not run in background(鍵名:UIApplicationExistsOnSuspend)自從iOS4.0之後,當你在應用程式執行的時候按下Home鍵,應用程式並不會中斷目前的執行,而是躲到背景去了.因此希望使用者在按下Home鍵之後就要中斷目前程式的執行,請勾選這個選項. 2.     Application requires iPhone environment(鍵名:LSRequiresIPhoneOS)iOS的家族繫ㄌㄧ誒

【hash_map】hash_map中键为自定义类型的操作

class person { public: string name; int age; person(string s,int i):name(s),age(i){} }; struct person_hash { static const size_t bucket_size = 4; static const size_t min_buckets = 8; //哈希值函数 size_t operator()(const person &p)const { //原来使用 return has

C#集合类型——Hashtable、Dictionary之浅谈

Hashtable表 数组.数组集合.List集合都是通过索引来访问里面成员.哈希表则是通过键来访问成员值.键不可为空,值可为空. 比如: Hashtable  hash=new  Hashtable(); hash.Add("one","chen"); hash.Add("two","li"); Console.WriteLine(hash["one"]); 运行结果:chen 基本的常用方法 1,添加

C#中的HashSet, HashTable, Dictionary的区别【转】

HashSet和Python中的Set差不多,都是为逻辑运算准备的,HashSet不允许数据有重复,且存入的时单值不是键值对. HashTable和Dictionary差不多,但是他们的实现方式时不同的,Dictionary俗称字典,里面存放的时键值对,即KeyValuePair,且支持泛型,而HashTable国内一般译为哈希表,但是在我看来,为了更好表达它的本质,翻译为散列表比较好,因为HashTable里面村的key时以散列的方式存储的,但是Dictionary里面是按顺序的方式存的Key