‫在这节课中, 我们将介绍哈希表, 稍后我们还会学习字典｡
‫因此哈希表和字典是C#中最有用的集合｡
‫因此, 我们将了解如何定义它们, 如何使用它们, 以及在哪些情况下, 我们应该利用它们｡
‫了解散列和表的概念｡
‫首先, 想想一本真实的字典｡
‫所以假设我们有一个德语和英语词典, 其中德语中的每个单词只对应于英语中的一个单词,
‫因为这将限制这里的限制｡
‫所以当我们试着翻译单词auto的时候, 德语中的auto基本上可以翻译成英语中的car,
‫我们用一个单词作为我们可以搜索的关键词, 例如, 我们得到了一个翻译结果｡
‫所以总是存在这种1对1的关系｡
‫所以我们有汽车, 它可以转化为汽车, 我们也可以通过哈希表来实现｡
‫我们将在一个非常具体的例子中使用它｡
‫假设我们有一个学生注册系统, 每个学生都有一个ID和许多其他数据, 如姓名､ 年龄､
‫成绩和照片等｡
‫为了使这样的系统工作, 我们需要为每个学生提供一个特殊的ID｡
‫所以它必须是独一无二的｡
‫如果我们使用哈希表或字典来存储这些数据,
‫学生ID将是键, 学生数据将是包含所有其他学生信息的对象, 这将是值｡
‫所以我们总是有这个键值对｡
‫这就是你如何找到实际数据的方法, 可以这么说, 这就是它背后的价值｡
‫所以你可以看到它像一个储物柜｡
‫这是储物柜的ID或者储物柜的位置｡
‫它可以是不同类型的数据｡
‫它不一定是ID, 它将是值｡
‫所以字典, 它们在哈希表中必须是同一类型的｡
‫它们可以是不同的类型｡
‫例如, 这可以是一个整数, 这可以是一个对象.
‫所以我们先来看看哈希表｡
‫因此, 我们要创建一个新类, 或者说我已经为此准备了一个新类｡
‫我们把它放在这里吧｡
‫它有几个特性｡
‫它有一个ID属性､ 一个名称属性和GPA｡
‫然后我们有一个非常简单的构造函数, 只需要赋值｡
‫因此, 无论我们在创建学生对象时传递给它的ID是什么, 它都将是学生对象的ID, 依此类推｡
‫所以这里没什么特别的｡
‫我们只是使用一个普通的类, 就像我们在类一章中讨论的那样｡
‫当然, 现在我们可以继续在单独的文件中创建该类, 这样我们就可以继续打开我们的解决方案资源管理器｡
‫在此处创建一个新文件｡
‫因此, 添加新的项目或一个新的类, 这样, 并称之为学生｡
‫但是对于这个例子, 我将保持它的简单, 并把它放在一个文件中｡
‫如您所知, 最佳做法是将其放在单独的文件中, 这样您就不会混淆内容,
‫并且可以更容易地找到文件和类等等｡
‫好了, 现在我们有了学生类, 我们可以继续创建一个哈希表｡
‫在我们的程序里面, 在main方法里, 我将在这里定义一个新的哈希表,
‫它将是一个类似的哈希表.
‫我将把这个表称为新哈希表
‫哈希表类位于系统集合内部, 因此我们需要使用系统集合在此处添加此命名空间｡
‫哈希表和哈希表命名空间是不同的, 因为我就是这样调用的,
‫如果我们想输入哈希表, 而不想把这个命名空间添加到我们的项目中, 这可能会混淆我们的ID｡
‫但是现在我们已经在程序类中使用了它, 我们可以使用它了｡
‫所以我们有了这个新的哈希表, 它现在是一个数据表, 我们可以把我们想要的数据放在那里｡
‫这就是你如何创建这样一个哈希表, 如何用一个空的哈希表对象初始化它, 就像我们在这里做的那样｡
‫现在我们可以给这个哈希表赋值, 我们甚至可以把它叫做student's table,
‫这样代码就更容易读了.
‫所以现在我们只需要创建一组我们想在表中包含的学生｡
‫所以让我把这些也加进去｡
‫我将把它们命名为studone stat, 2到3, step four, 它们都将是新的student对象｡
‫这是有ID的学生, 一个是玛丽亚｡
‫她的平均绩点是98｡
‫然后我们有JSON, 它的ID为1｡
‫这是这个ID, 唯一的标识符, 可以这么说, 然后是学生的GPA｡
‫好吧, 我会的
‫现在, 我们有了所有这些学生, 可以使用学生ID将他们分配到学生表中｡
‫好的做法是继续, 将students表中的点添加到此处, 我们使用student的一个ID,
‫因此此处的属性为键｡
‫这里你可以看到哈希表允许我们有一个对象类型的键, 所以它可以是任何类型的对象作为键,
‫也可以是可选的或可知的对象作为值｡
‫所以我们可以赋值, 也可以为空｡
‫好的, 但是我们要给学生赋值, 就像这样｡
‫现在, 我们将学生1添加到学生表中, 我们可以对其他学生执行同样的操作,
‫我们将对每个学生使用他们的ID｡
‫所以让我们用学生的表来表示所有的人｡
‫好吧, 我会的
‫这就是我们的哈希表了, 但是我们如何获取条目呢？
‫那么, 我们如何从哈希表中检索条目呢？
‫好吧, 让我们来看看不同的方式｡
‫我们首先可以在这里创建一个student对象｡
‫因此student和这个对象将被称为stored student｡
‫所以我要从我的表中得到学生值｡
‫在本例中, 它是学生表｡
‫学生们表喜欢如此｡
‫这里类似于我在数组中访问它的方式｡
‫X是数组中的一个值, 我可以通过ID来访问它.
‫比如说, 我想得到一个ID为1的变量.
‫这里的问题是这个哈希表可以有对象类型的值, 就像我们之前看到的.
‫这里, 如果我们继续调用add方法, 你可以看到我们可以赋值一个键, 但是值的类型是object.
‫这意味着这里的类型是object｡
‫但我们不能只为学生分配一个对象类型｡
‫它必须是off类型的student, 因为存储的student 1实际上是student类型｡
‫所以我们需要确保把它转换成一个学生, 这样就可以了｡
‫好的, 我们把这个对象转换成一个学生, 因为我们知道在学生桌子里面的位置1｡
‫因此, 在ID 1处, 值实际上是student类型｡
‫在这里你可以找到ID为1的学生, 也可以找到ID为2的学生, 以此类推.
‫但这只是因为我们知道我们实际上是在使用这些数字｡
‫所以如果你想得到它, 否则你可以用第三个ID｡
‫现在, 这将为您给予student one ID背后的值｡
‫所以这基本上会给予你这个值或者这个学生｡
‫准确地说, 是这个｡
‫这里的这个, 因为这是我们在这个ID 1中存储的内容｡
‫现在我们可以这样做了, 我们现在不再写hello world, 而是写一些有用的东西,
‫我们写学生ID, 学生的名字, 以及他的GPA｡
‫我们将使用存储的学生一个点ID｡
‫所以我们拿到了他的身份证, 他的名字, 他的平均成绩｡
‫在这个例子中, 是她的平均绩点, 以此类推, 因为玛丽亚在ID 1的位置1｡
‫好的, 让我们运行这个, 你可以看到学生ID是一个名字是玛丽亚和GPA是98｡
‫这里我们看到了如何创建一个哈希表｡
‫这就是我们在哈希表中存储数据的方法｡
‫实际上, 这是我们在哈希表中存储数据的地方｡
‫这就是我们从哈希表中检索数据的方法｡
‫现在我们假设要打印哈希表中的所有数据, 并且没有特定的键｡
‫我们可以简单地从哈希表中获取所有的键来解决这个问题｡
‫首先, 我们必须讨论一个名为字典条目的结构体｡
‫每当我们在哈希表中添加新条目时｡
‫因此我们的键值对, 一个新的字典条目对象将被创建, 它将被插入到我们的哈希表中,
‫这意味着哈希表基本上是一个字典条目的集合｡
‫因此, 使用一个临时的字典条目对象, 我们可以使用for each循环遍历哈希表｡
‫让我们看看这个特定的例子, 我将在这里使用for each循环｡
‫每个循环类型的这个将是字典条目｡
‫这就是我说的结构体｡
‫你可以在这里看到struct字典条目｡
‫那么, 我将使用的项目名称是什么？
‫我将使用entry｡
‫当然, 你可以称之为student或其他什么,
‫因为你知道条目的类型是student, 但是假设你不知道它, 你也可以称之为entry｡
‫然后我们要运行的集合是什么, 或者我们要从中获取值的集合是什么, 这就是我们的学生表｡
‫所以这一个是取回的｡
‫具有已知ID的个别物料｡
‫还有这里
‫从哈希表中检索所有值｡
‫好吧, 我会的
‫所以哈希表中的一个条目是字典条目类型的, 就像我刚才说的.
‫所以这让我们现在来看看这个｡
‫表, 学生表也基本上显示了这些值｡
‫在这里, 因为entry值将返回一个对象, 你可以看到这里它表示对象｡
‫但是为了获取学生的详细信息, 我们需要的是一个学生对象｡
‫我们需要做的是我们需要做以下事情｡
‫所以我们创造了一个临时价值, 这将是我们的入口价值｡
‫现在我们遇到了同样的问题, 我们需要把它转换成一个学生, 因为它只是一个对象, 对吧？
‫但我们希望它是student类型, 这样我们就可以访问student属性｡
‫因为否则的话, 入口值, 它在这里没有ID, 我不能访问它的ID, 我不能访问它的名称,
‫所有这些东西, 即使它存在于那里｡
‫但我们的ID不允许这样做, 因为我们首先需要确保将值转换或强制转换为正确的类型, 即student类型｡
‫所以现在我们正在转换它, 我们暂时存储它, 现在我们可以继续, 把各个值写入我们的控制台, 例如,
‫或者使用我们的程序, 我们想要的｡
‫在这里, 我们可以通过模板ID来使用学生ID,
‫因为temp现在的类型是student, student的ID名称是GPA, 我们现在可以访问所有这些ID, 以遍历所有学生的整个列表｡
‫所以让我们来做一个真实的快速｡
‫让我们运行代码, 看看这个for each循环对我们有什么作用, 这样你就能看到它是如何运行的｡
‫上面说｡
‫学生4史蒂夫｡
‫学生3巩膜｡
‫学生二是杰森, 一是玛丽亚｡
‫所以你可以看到它从后面到井, 从最后一个入口到第一个入口｡
‫现在, 如果我们不知道它是否是一个学生, 即使我们已经把它转换成了一个学生｡
‫这实际上只是向您展示散列表实际上只是字典条目的集合｡
‫我们来看看如何简化每个循环｡
‫我们可以简化它, 实际上说, 对于每个变量类型, 都是一个student｡
‫项目名称, 嗯, 你可以叫它学生｡
‫我就称之为值像｡
‫所以没关系｡
‫我想学习的集合是表, 而学生的表是点值｡
‫所以有一个哈希表值的人工智能集合｡
‫因此, 获取包含哈希表中的值的AI集合｡
‫因此, 这允许我们直接查看这些值, 而无需进行其他操作｡
‫基本上就像我们在这里所做的那样, 我们转换它或者将它转换成一个学生对象｡
‫所以现在我们可以继续了｡
‫做和我们在这里做的一样的事情｡
‫当然, 现在它将是值ID等等, 因为它不是条目, 也不是临时值,
‫但实际上它将是值, 因为这是每个组的值｡
‫每次迭代时, 它都会遍历所有的值｡
‫价值是指我们当前针对特定迭代所考虑的个体价值｡
‫所以在第一次迭代中, 它将是｡
‫史蒂夫｡
‫然后是克拉拉, 然后是杰森, 然后是玛丽亚｡
‫所以如果我们去掉这一行, 或者是每个循环的这一行, 然后再运行一次, 我们会看到得到相同的结果｡
‫史蒂夫, 克拉拉, 杰森和玛丽亚
‫好吧, 我会的
‫以上是对哈希表的简要介绍, 下一个视频,
‫我将给你们一个小挑战, 你们将扩展代码, 以便更好地理解哈希表｡
‫然后我们会看字典｡