网站首页 > 基础教程 正文
字典
在上一节中,你了解了Hashtable类,这是与哈希表相关的非泛型类的一个变体。然而,它有一个显著的限制,因为它不允许你指定键和值的类型。DictionaryEntry类的Key和Value属性都是对象类型。因此,即使所有的键和值都是同一种类型,你也需要执行装箱和拆箱操作。如果你想从强类型版本中受益,你可以使用Dictionary泛型类,这是本节的主要内容。
首先,在创建Dictionary类的实例时,你应该指定两种类型,即键的类型和值的类型。此外,可以使用以下代码定义字典的初始内容:
在前面的代码中,创建了一个 Dictionary 类的新实例。它存储基于字符串的键和值。这里,字典中存在两个条目,分别是 Key #1 和 Key #2。它们的值是 Value #1 和 Value #2。
类似于 Hashtable 类,你也可以使用索引器来访问集合中的特定元素,如下一行代码所示:
值得注意的是,将类型转换为字符串是不必要的,因为Dictionary是与哈希表相关的类的强类型版本。因此,返回的值已经具有正确的类型。如果集合中不存在具有给定键的元素,则会抛出KeyNotFoundException异常。为了避免问题,你可以通过调用ContainsKey方法检查元素是否存在,或者使用TryGetValue方法。
你可以使用索引器添加新元素或更新现有元素的值:
与非泛型变体类似,键不能等于null,但如果集合中存储的值类型允许,值可以为null。
字典类配备了一些属性:
? Count,用于获取存储的元素数量
? Keys,返回键的集合
? Values,返回值的集合
你还可以使用一些可用的方法:
? Add,向字典中添加一个新元素
? Remove,从字典中移除一个元素
? Clear,从字典中移除所有元素
? ContainsKey,检查字典是否包含某个键
? ContainsValue,检查字典是否包含某个给定的值
? TryGetValue,尝试从字典中获取给定键的值
正如你所见,许多属性和方法与Hashtable类的情况几乎相同。命名的一致性允许你轻松使用各种类,而无需从头开始学习一切。
性能如何?
你应该记住,获取元素值(使用索引器或TryGetValue)、更新现有元素(使用索引器)以及检查给定键是否存在于字典中(ContainsKey)的操作接近于O(1)操作。然而,检查集合是否包含给定值(ContainsValue)是一个O(n)操作,需要你搜索整个集合以找到特定的值。
如果你想遍历集合中存储的所有键值对,你可以使用foreach循环。然而,循环中使用的变量是KeyValuePair泛型类的实例,它具有Key和Value属性,允许你访问键和值。以下代码片段展示了foreach循环:
在这里,你也可以应用你所学到的关于值元组和解构操作的知识。因此,前面的foreach循环可以被简化,如下所示:
正如你所见,C# 语言正在配备越来越多有用的特性,这些特性使你的代码更短、更简单、更易于理解。你应该关注语言的更新。干得好,C# 团队 - 我期待更多的更新!
线程安全版本
你还记得上一章中提到的线程安全的队列相关类吗?如果是的话,字典的情况看起来非常相似,因为 System.Collections.Concurrent 命名空间中提供了 ConcurrentDictionary 类。
有了这个简短的介绍,让我们开始编码吧!在接下来的章节中,你将找到两个使用字典存储数据的真实世界示例。
示例 - 产品位置
我们将要查看的第一个例子是一个应用程序,它帮助商店的员工找到产品的具体位置。想象一下,每位员工都有一部装有您应用程序的手机,他们用它来扫描产品的条形码,应用程序会告诉他们产品应该位于A1区或C9区。听起来很有趣,对吧?
由于商店中的产品数量通常非常高,因此必须非常快速地找到结果。因此,产品及其位置的数据存储在哈希表中,使用通用的Dictionary类。键是条形码(字符串),而值是区域代码(也是字符串),如下所示:
首先,你创建一个新的集合并添加一些数据:
代码展示了向集合中添加元素的两种方式,一种是在创建类的新实例时传递它们的数据,另一种是使用索引器。还存在第三种解决方案,它使用了Add方法,如下代码所示:
另一种解决方案使用了TryAdd方法,如下所示:
在代码的以下部分,你展示了系统中所有可用产品的数据。为此,你使用了foreach循环。在此之前,你检查字典中是否有任何元素。如果没有,向用户显示适当的消息。否则,所有键值对的键和值将在控制台中显示:
现在,让我们来看看代码的这一部分,它使得通过条形码找到产品的地点成为可能。为此,你可以使用TryGetValue来检查元素是否存在。如果存在,控制台将显示包含目标位置的消息。否则,将显示其他信息。代码如下所示:
当你运行程序时,你会看到商店里所有产品的列表,程序会要求你输入条形码。输入后,你会收到一条包含地区代码的信息。控制台显示的结果应该类似于以下内容:
你刚刚完成了第一个例子!让我们继续下一个。
示例 - 用户详情
这个第二个例子向你展示了如何在字典中存储更复杂的数据。在这个场景中,
你将创建一个应用程序,根据他们的标识符显示用户详情,如下所示:
程序以三个用户的数据开始。你应该能够输入一个标识符并查看找到的用户详情。当然,如果给定的用户不存在,应该通过在控制台中呈现适当的信息来处理这种情况。
首先,让我们添加员工记录,它存储员工的数据,即名字、姓氏和电话号码。代码如下:
然后,创建一个Dictionary类的新实例并向其中添加数据:
最有趣的操作是在接下来的 do-while 循环中执行的:
首先,要求用户输入员工的标识符,然后将其解析为整数值。
当提供的标识符无法解析为整数值时,循环停止。否则,使用TryGetValue方法尝试获取用户详情。
如果找到了用户(TryGetValue返回true),则在控制台中显示详情。否则,显示错误消息。
当你运行应用程序并输入一些数据时,你将收到以下结果:
就这样!你已经完成了两个示例,展示了如何在C#语言开发应用程序时使用字典。你还记得已经提到了另一种字典,即排序字典吗?你有兴趣了解它是什么以及如何在你的程序中使用它吗?如果是的话,请继续阅读下一节。
猜你喜欢
- 2024-12-29 C#异步编程之Task的使用 c#异步处理
- 2024-12-29 「详解」源代码自动格式化工具:Artistic Style
- 2024-12-29 C# using用法 c# using语句
- 2024-12-29 MDK中使用AStyle插件对代码进行格式化处理
- 2024-12-29 c#中使用miniExcel和fastreport实现付款审批单的批量打印
- 2024-12-29 程序员必练六项目:从数据结构到操作系统,计算机教授为你画重点
- 2024-12-29 C#上位机开发入门(3) c#上位机需要学什么
- 2024-12-29 C#06(从控制台输入与类型转换) c#从控制台输入数据
- 2024-12-29 C#-循环数组结构体知识补充 055 c#用循环结构计算1+2+3+4+5+6...+100
- 2024-12-29 正确复制、重写别人的代码,不算抄袭
- 01-09Oracle数据库面试题汇总
- 01-09Oracle AWR解析-Report Summary
- 01-09想要成为数据分析师,这些Excel必备知识点你得掌握
- 01-09java开发中常用Oracle函数实例总结比较,当真不少
- 01-09DriveWorks其实是这么回事
- 01-09EXCEL做数据分析,学会这些就入门了
- 01-09一场pandas与SQL的巅峰大战(六)
- 01-09Oracle数据库知识 day01 Oracle介绍和增删改查
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)