‫在这段视频中, 我们将介绍一些非常重要的界面, 一旦你想成为一名更高级的商店开发人员,
‫你就应该了解这些界面｡
‫这就是AI可枚举接口和AI枚举器接口｡
‫因此, 在观看本视频之前, 您应该了解接口,
‫否则有些概念可能对您没有意义｡
‫因此, 我强烈建议您查看一下我们提供的界面视频｡
‫好吧, 我会的
‫因此, AI可枚举接口是C sharp中许多集合的基础接口,
‫它的工作是提供一种遍历集合的方法｡
‫这就是为什么我们可以使用for each循环遍历一个列表或字典, 因为它们是从可枚举接口继承的｡
‫所以简单的英语中的可枚举接口,
‫当集合类实现AI可枚举接口时, 它就变成了可计数的, 我们可以单独计算其中的每个元素｡
‫因此, AI可枚举接口有两个不同的版本｡
‫一个是对泛型集合有效的, 在泛型集合中, 你有这个AI可枚举的左括号,
‫右括号, 然后是非泛型集合的AI可枚举接口｡
‫因此, 您还应该了解什么是泛型和非泛型集合｡
‫他们有一定的优点和缺点, 但我有一个视频, 以及｡
‫我希望你在看这个视频之前看过它, 否则它会有点复杂｡
‫好吧, 我会的
‫我们来看看这两个｡
‫由于泛型集合是在非泛型集合之后引入的, 因此建议使用泛型集合｡
‫所以可以说它们基本上是一个改进的版本｡
‫因此, 如果您正在创建一个新项目,
‫建议使用泛型版本, 因为非泛型集合的I可枚举需要应用或执行装箱和取消装箱, 这基本上是对象类型的转换｡
‫我们将在后面解释如何使用AI可枚举tty接口｡
‫所以泛型集合接口, 我们不打算讨论非泛型集合接口, 因为不建议使用它,
‫因为装箱和拆箱效率较低｡
‫所以现在我们来看看AI枚举和AI枚举器之间的区别｡
‫你可能以前听过这些｡
‫所以AI可枚举接口包含了一个方法, 在实现这个接口的时候, 你必须实现这个方法,
‫我们将在后面的例子中做这个.
‫这样就说得通了｡
‫因此, get enumerate方法是您需要实现的方法, 它返回一个AI枚举器对象｡
‫所以当你想为类使用AI枚举值或者你想为类实现它时,
‫你需要实现这个方法, 你需要有这个get枚举值方法, 它会返回一个AI枚举值.
‫所以AI枚举器｡
‫借由公开目前属性（指向集合中目前所在的物件）, 提供在集合中重复的能力｡
‫这比我们在特定示例中实际运行时要复杂得多｡
‫所以我们要构建一个例子来充分理解这一切的含义｡
‫所以这只是为了让你做好准备｡
‫好吧, 那我们开始吧｡
‫最后, 让我们抛开所有这些理论, 实际地看看实践｡
‫我们来创建一个名为dog的小类｡
‫我将把它放在同一个文件中, 以使事情简单｡
‫所以我们有一个名为Dog的类, 还有一个布尔值, 叫做淘气狗.
‫所以我们基本上会检查狗是不是淘气｡
‫在此基础上, 我们要给予他吃的｡
‫所以, 如果他不是一只淘气的狗, 他会得到较少的对待比如果他是一个好男孩或一只好狗｡
‫所以这里的构造函数基本上只设置这两个值｡
‫所以当我们创建一个dog对象时, 我们会给予它一个名字和一个布尔值, 不管这只狗是否淘气｡
‫然后我们有这个礼物对待方法, 这将基本上只是打印出狗说, 汪｡
‫所以每一次给狗吃的东西, 它都会叫一声“汪”｡
‫所以基本上, 如果他是一只好狗, 你会得到两个对待, 他会移动两次｡
‫如果他是一只坏狗或顽皮的狗, 那么他只会移动一次, 因为他会得到较少的对待｡
‫好吧, 我会的
‫现在我们有了这个类dock, 我们可以继续创建dog对象｡
‫所以我们再上一节课｡
‫让我们假设我们有另一个类, 它将在列表中使用dogs｡
‫所以我们有这个狗收容所的课程｡
‫所以这个狗收容所的班级会有一份狗的名单｡
‫所以我们需要确保使用泛型系统集合, 因为list是一个泛型集合｡
‫因此, 在顶部, 您将看到, 现在您已经使用了系统集合泛型｡
‫好吧, 我会的
‫现在我们有了这个狗收容所, 在这个狗收容所的构造函数中有了狗的列表,
‫我们要做的唯一一件事就是用一堆狗来初始化这个狗的列表.
‫所以我们有卡斯珀狗或者叫卡斯珀的狗｡
‫他不是一个老狗, 但如果是一个顽皮的狗, 奥利奥是不是顽皮和像素也不是顽皮｡
‫所以不要问我我们是怎么想出这些名字的, 但这基本上就是我们要给这些狗起的名字｡
‫当然, 你可以让整个应用程序变得更复杂, 但我们的想法实际上只是使用这份狗的列表来遍历狗收容所,
‫基本上是遍历狗收容所｡
‫根据一只狗是好狗还是坏狗, 我们会给予一次或两次治疗｡
‫现在让我们转到main方法, 因为这是应用程序的起点｡
‫在这一点上, 让我们继续在这里创建一个狗收容所｡
‫好吧, 我会的
‫所以我们有一个叫Shelter的狗收容所, 它将是一个新的狗收容所｡
‫所以我们也直接初始化它, 这样我们就可以使用这个shelter对象, 因为shelter对象将包含一个狗的列表｡
‫好吧, 我知道了
‫现在我们要做的是遍历列表, 检查是否要给予他们零食.
‫所以我们在这里为每一个创建一个像这样的双制表符, 以便为我们做好准备｡
‫那么, 我们要经历什么呢？
‫好吧, 我们正在经历一只狗｡
‫我们要叫一只狗｡
‫所以列表中的每一项都是一条狗｡
‫然后我们要通过的集合, 实际上, 是避难所｡
‫喜欢｡
‫所以现在我们有个小问题｡
‫当我们将鼠标悬停在它上面时,
‫我们说我们在这里看到要迭代的集合或数组的名称是shelter, 但是for each语句不能对dog
‫shelter类型的变量进行操作, 因为dog shelter不包含get枚举器的公共实例或扩展定义｡
‫好了, 我们有了这个get枚举器｡
‫那是什么意思呢？
‫这意味着我们需要在这里为我们的狗收容所实现接口I, enumerable, 因为这个狗收容所有一个我们想迭代的列表｡
‫对不对？
‫因为如果你看它, 收容所, 嗯, 我们的狗收容所, 这是我们想迭代通过的收容所｡
‫为了使它可迭代, 我们需要在这里实现AI可枚举｡
‫我们要枚举什么类型的对象？
‫在我们的情况下, 是狗.
‫所以我们希望能够遍历狗收容所里的狗, 因为我们有一个狗的列表,
‫它在狗收容所的构造函数中初始化.
‫我们要确保我们可以通过所有的, 并做一些与狗, 像宠物他们或在我们的情况下,
‫给予他们一个对待｡
‫所以一旦你实现了这个, 你走到这里, 错误就消失了｡
‫所以突然间一切都好了, 因为, 嗯, 我们的收容所, 这是一个狗收容所,
‫现在遵循刚刚给我们的指示, 它需要实施它｡
‫我在这里可数｡
‫这是泛型I, 可枚举的, 因为我们这里有一个doc.
‫对不对？
‫因为不是这个｡
‫就是我们给它的那种类型｡
‫但是现在, 当我们悬停在它上面时, 我们看到我们得到了另一个错误｡
‫它表示doc shelter不实现接口成员｡
‫I可枚举的doc get枚举器和I可枚举的get枚举器, 这样我们就可以手动将它们放在那里｡
‫但使用ID的好处在于, ID可以为我们做很多工作, 因此,
‫您可以单击“显示潜在修复程序”, 然后单击“显式实现所有成员”, 然后它将为我们添加集合命名空间,
‫并负责为我们或这两个成员添加这两个方法｡
‫单击此按钮后, 您会看到此错误将消失｡
‫如果我们继续向下滚动, 您会发现现在我们返回了一个doc类型的枚举数和一个非泛型I枚举数集合｡
‫所以现在我们还没有实施｡
‫这就是为什么我们在这里抛出新的未实现的x异常｡
‫所以我们需要改变一下｡
‫现在我们可以实现调用get枚举器方法后应该发生的事情｡
‫为了解决这个问题, 我们在这里要说的就是返回｡
‫狗我们的名单狗点得到枚举器就像这样｡
‫这将是实现, 因为我们的狗收容所现在实现了可枚举接口｡
‫我们这里的列表实际上是A, 如果你把鼠标悬停在它上面, 列表就是一个通用列表｡
‫现在我们可以使用这些列表狗, 我们可以得到每个组的每一次迭代的枚举数｡
‫所以基本上它会返回个别狗｡
‫现在我们可以在for each循环中使用dog.
‫所以这基本上意味着我们现在可以继续检查狗是否不淘气｡
‫所以不是狗小点就是调皮｡
‫如果是这样的话, 基本上就是说如果狗不淘气, 我们会调用这个方法, 给予它一个奖励,
‫我们会给它两个奖励｡
‫否则, 如果他是顽皮的, 因为我们不能给予对待, 我们只是爱狗太多｡
‫我们就给予他们一次这样的款待｡
‫此时, 我们可以运行应用程序｡
‫等着瞧吧｡
‫卡斯珀说狼两次, 因为他是一个好狗, 嗅嗅是一个顽皮的狗, 所以他只得到一个对待, 他说,
‫汪, 一旦奥利奥做了两次, 像素移动两倍｡
‫好吧, 我会的
‫这就是你如何让你的类遵循指令, 或者实现一个AI可枚举, 这样你就可以使用for each循环遍历一个列表,
‫比如, 我们这里就有这样的例子｡
‫现在, 你可能想知道, 为什么我们不实现AI枚举的门枚举器, 一个非泛型的？
‫这是因为我们没有使用非泛型的例子,
‫我们的狗收容所也不是非泛型的, 但只是在使用AI可枚举接口时需要实现它, 否则如果你删除它, 我们会再次得到一个警告｡
‫你看这里, 我们实际上出错了, 所以我们需要确保我们也有这个方法｡
‫好吧, 我会的
‫这段视频到此为止｡
‫在下一个视频中, 我们将看到另一个例子, 我们将利用眼睛, 甚至更多｡
‫这只是一个小小的介绍｡
‫我知道这个话题相当复杂, 但我们要多利用一下｡
‫现在, 顺便说一句, 我来简单总结一下｡
‫什么时候推荐使用AI可枚举接口？
‫当您的集合表示一个大型数据库表时, 您应该使用它｡
‫因此, 您不希望将整个内容复制到内存中, 从而导致应用程序出现性能问题, 因为数据库可能非常庞大,
‫对吗？
‫它可能有数以百万计的条目｡
‫您不希望必须加载整个过程才能迭代它,
‫而只希望加载当前进程所需的所有内容, 无论您希望执行什么｡
‫那么什么时候不应该使用AI可枚举接口呢？
‫好吧, 当你马上需要结果的时候, 你可能会变异, 稍后编辑对象｡
‫在这种情况下, 最好使用数组或列表｡
‫因此, 如果你想在以后修改或编辑对象, 而又不想马上得到结果, 那么就使用数组或列表｡
‫否则, 使用AI可枚举, 因为它会更有效｡
‫好吧, 我会的
‫这段视频到此为止｡
‫下一场见｡