专业编程基础技术教程

网站首页 > 基础教程 正文

C# 数据结构和算法 :06 字典和集合(二)

ccvgpt 2024-12-29 01:49:12 基础教程 6 ℃

字典

在上一节中,你了解了Hashtable类,这是与哈希表相关的非泛型类的一个变体。然而,它有一个显著的限制,因为它不允许你指定键和值的类型。DictionaryEntry类的Key和Value属性都是对象类型。因此,即使所有的键和值都是同一种类型,你也需要执行装箱和拆箱操作。如果你想从强类型版本中受益,你可以使用Dictionary泛型类,这是本节的主要内容。

首先,在创建Dictionary类的实例时,你应该指定两种类型,即键的类型和值的类型。此外,可以使用以下代码定义字典的初始内容:

C# 数据结构和算法 :06 字典和集合(二)

在前面的代码中,创建了一个 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#语言开发应用程序时使用字典。你还记得已经提到了另一种字典,即排序字典吗?你有兴趣了解它是什么以及如何在你的程序中使用它吗?如果是的话,请继续阅读下一节。

Tags:

最近发表
标签列表