C#中Hashtable和Dictionary的区别

 更新时间:2024年04月15日 09:27:40   作者:那个那个鱼  
Hashtable 和 Dictionary 都是 C# 中用于存储键值对的数据结构,本文主要介绍了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<TKey, TValue>包含在System.Collections.Generic命名空间中。Dictionary<TKey, TValue>可以支持指定的任何类型的key/value键值对。所以Dictionary<TKey, TValue>对象只能添加指定类型的key/value键值对。Dictionary<TKey, TValue>中每个对象是一个存储在KeyValuePair<TKey, TValue>对象中的键值对。

常用属性

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

常用方法

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

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<int, string> kp in dc)
{
    Console.WriteLine("{0} - {1}", kp.Key, kp.Value);//输出:21002122 - 李四
}

dc.Clear();
Console.WriteLine("---- 移除全部之后 ----");
foreach (KeyValuePair<int, string> kp in dc)
{
    Console.WriteLine("{0} ----- {1}", kp.Key, kp.Value);//无输出
}


Console.ReadKey();

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

Dictionary<int, int> dc = new Dictionary<int, int>();
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<TKey, TValue>耗时(毫秒):" + 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 中的键值对是按照插入顺序排序的。

总结:

  • 如果需要一个类型安全、性能较好且不需要存储 null 键和 null 值的键值对集合,推荐使用Dictionary。
  • 如果需要一个可以存储任意类型的键和值,并且不关心性能和类型安全性的话,可以使用Hashtable。

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

相关文章

  • C#实现带进度条的ListView

    C#实现带进度条的ListView

    这篇文章主要介绍了C#实现带进度条的ListView 的相关资料,需要的朋友可以参考下
    2016-02-02
  • 详解C# 不能用于文件名的字符

    详解C# 不能用于文件名的字符

    在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符,那么具体是包括哪些符号不能作为文件名呢?下面小编给大家介绍下
    2018-02-02
  • C#实现简化QQ聊天窗口

    C#实现简化QQ聊天窗口

    这篇文章主要为大家详细介绍了C#实现简化QQ聊天窗口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • .Net常见问题之C#中的委托

    .Net常见问题之C#中的委托

    这篇文章主要介绍了.Net常见问题委托概念的介绍,委托类似于C++中的函数指针,但是又有所不同,下面就针对委托这个概念给大家详细介绍下,需要的朋友可以参考下
    2015-07-07
  • C#中括号强转、as、is区别详解

    C#中括号强转、as、is区别详解

    本文主要介绍了C#中括号强转、as、is区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C#使用log4net记录日志的方法步骤

    C#使用log4net记录日志的方法步骤

    本文主要介绍了C#使用log4net记录日志的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C#二维数组基本用法实例

    C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • C#实现批量压缩和解压缩的示例代码

    C#实现批量压缩和解压缩的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现批量压缩和解压缩的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C# yield关键字详解

    C# yield关键字详解

    这篇文章主要介绍了C# yield关键字详解,本文讲解了yield是一个语法糖、语法糖的实现(实现IEnumerable<T>接口的类)、yield使用中的特殊情况等内容,需要的朋友可以参考下
    2015-04-04
  • 使用C#对JSON进行序列化和反序列化处理的两种方法

    使用C#对JSON进行序列化和反序列化处理的两种方法

    本指南探讨了如何使用 C# 编程语言进行 JSON 序列化和反序列化,我们将介绍 .NET 生态系统中可用的两个本机选项,即命名空间和广泛使用的 Newtonsoft.Json 库(也称为 Json.NET),需要的朋友可以参考下
    2024-06-06

最新评论