C#中Hashtable和Dictionary的区别

  目录

  Hashtable 和 Dictionary 都是 C# 中用于存储键值对的数据结构

  哈希表 Hashtable

  使用Hashtable需要引入命名空间System.Collections。Hashtable中key/value的键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对,Hashtable中每个对象是一个存储在DictionaryEntry对象中的键值对。

  常用属性

  属性描述Count获取Hashtable中包含的键值对个数Keys获取Hashtable中所有键的集合Values获取Hashtable中所有值的集合

  常用方法

  方法描述public virtual void Add(object key, object value);向Hashtable添加一个带有指定的键和值的元素public virtual bool ContainsKey(object key);判断Hashtable是否包含指定的键public virtual bool ContainsValue(object value);判断Hashtable是否包含指定的值public virtual void Remove(object key);从Hashtable中移除指定的键的元素public virtual void Clear();从Hashtable中移除所有的元素

  注意:由于IDictionary接口是键/值对的非泛型集合的基接口,而每个元素都是键/值对,并存储在DictionaryEntry对象中,因此元素类型既不是键的类型,也不是值的类型,而是DictionaryEntry类型。(留个坑,自己也没搞明白是啥)

  Hashtable ht = new Hashtable();

  ht.Add(1, true);

  ht.Add(2, "FALSE");

  Console.WriteLine("当前包含键值对个数:{0}", ht.Count);//输出:2

  Console.WriteLine("---- 通过键求键值对 ----");

  foreach (var key in ht.Keys)

  {

  Console.WriteLine("{0} - {1}", key, ht[key]);//输出:2-"FALSE" 1-True

  }

  Console.WriteLine("---- 添加后值的集合 ----");

  foreach (var value in ht.Values)

  {

  Console.WriteLine("{0}", value);//输出:FALSE True

  }

  if (ht.ContainsKey(1))

  {

  Console.WriteLine("Hashtable中包含键 1 .");//输出

  }

  if(ht.ContainsValue(true))

  {

  Console.WriteLine("Hashtable中包含值 true .");//输出

  }

  ht.Remove(1);

  Console.WriteLine("---- 移除键 1 之后 ----");

  foreach(DictionaryEntry de in ht)

  {

  Console.WriteLine("{0} - {1}", de.Key, de.Value);//输出:2 - FALSE

  }

  ht.Clear();

  Console.WriteLine("---- 移除全部之后 ----");

  foreach (DictionaryEntry de in ht)

  {

  Console.WriteLine("{0} ------- {1}", de.Key, de.Value);//无输出

  }

  Console.ReadKey();

  字典 Dictionary

  Dictionary包含在System.Collections.Generic命名空间中。Dictionary可以支持指定的任何类型的key/value键值对。所以Dictionary对象只能添加指定类型的key/value键值对。Dictionary中每个对象是一个存储在KeyValuePair对象中的键值对。

  常用属性

  属性描述Count获取Dictionary中包含的键值对个数Item获取Dictionary中的某个键值对Keys获取Dictionary中所有键的集合Values获取Dictionary中所有值的集合

  常用方法

  方法描述public void Add(TKey key, TValue value);将指定的键和值添加到字典中public bool ContainsKey(TKey key);判断Dictionary是否包含指定的键public bool ContainsValue(TValue value);判断Dictionary是否包含指定的值public bool Remove(TKey key);从Dictionary中移除指定的键的元素public void Clear();从Dictionary中移除所有的键值对

  Dictionary dc = new Dictionary();

  dc.Add(21002121, "张三");

  dc.Add(21002122, "李四");

  Console.WriteLine("字典中的键值对个数:{0}", dc.Count);//输出:2

  Console.WriteLine("---- 添加之后键值对 ----");

  foreach (var item in dc)

  {

  Console.WriteLine("{0} - {1}", item.Key, item.Value);//输出:21002121 - 张三 21002122 - 李四

  }

  Console.WriteLine("---- 通过键求键值对 ----");

  foreach (var key in dc.Keys)

  {

  Console.WriteLine("{0} - {1}", key, dc[key]);//输出:21002121 - 张三 21002122 - 李四

  }

  Console.WriteLine("---- 添加后值的集合 ----");

  foreach (var value in dc.Values)

  {

  Console.WriteLine("{0}", value);//张三 李四

  }

  if(dc.ContainsKey(21002121))

  {

  Console.WriteLine("Dictionary中包含键 21002121 .");//输出

  }

  if(dc.ContainsValue("李四"))

  {

  Console.WriteLine("Dictionary中包含值 李四 .");//输出

  }

  dc.Remove(21002121);

  Console.WriteLine("---- 移除键 21002121 之后 ----");

  foreach (KeyValuePair kp in dc)

  {

  Console.WriteLine("{0} - {1}", kp.Key, kp.Value);//输出:21002122 - 李四

  }

  dc.Clear();

  Console.WriteLine("---- 移除全部之后 ----");

  foreach (KeyValuePair kp in dc)

  {

  Console.WriteLine("{0} ----- {1}", kp.Key, kp.Value);//无输出

  }

  Console.ReadKey();

  Hashtable 与 Dictionary 插入方法的时间比较

  Dictionary dc = new Dictionary();

  Hashtable ht = new Hashtable();

  int count = 10000000;//插入的次数 1千万

  Stopwatch sw = new Stopwatch();

  sw.Start();//计时

  for(int i = 0; i < count; i++)

  {

  dc.Add(i, i);

  }

  sw.Stop();

  Console.WriteLine("字典Dictionary耗时(毫秒):" + sw.ElapsedMilliseconds);//输出:388

  sw.Restart();

  for (int i = 0; i < count; i++)

  {

  ht.Add(i, i);

  }

  sw.Stop();

  Console.WriteLine("哈希表Hashtable耗时(毫秒):" + sw.ElapsedMilliseconds);//输出:2497

  Console.ReadLine();

  注意:所消耗的时间并不是唯一的,性能一般的电脑建议减低插入次数

  区别

  1. 实现方式:

  Hashtable 是基于哈希表实现的,而 Dictionary 是基于泛型实现的。

  2. 类型安全:

  Hashtable 是非泛型的,可以存储任意类型的键和值,而 Dictionary 是泛型的,可以指定键和值的类型,并在编译时进行类型检查,提供更好的类型安全性。

  3. 性能:

  由于 Hashtabl 是非泛型的,它在存储和检索数据时需要进行装箱和拆箱操作,这会带来一定的性能损耗。而 Dictionary 是泛型的,不需要进行装箱和拆箱操作,因此在性能上通常比 Hashtable 更好。

  4. 可空键和值:

  Hashtable 允许存储 null 键和 null 值,而 Dictionary 不允许存储 null 键和 null 值。

  5. 迭代顺序:

  Hashtable 中的键值对是无序的,而 Dictionary 中的键值对是按照插入顺序排序的。

  总结:

  到此这篇关于C#中Hashtable 和 Dictionary的区别的文章就介绍到这了,更多相关C# Hashtable Dictionary内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  您可能感兴趣的文章: