练习 - 编写代码以显示 ourAnimals 数组中的所有数据
在本练习中,你将编写用于显示我们的Animals 数组信息的嵌套循环结构和选择代码块。 在本练习中完成的详细任务包括:
- 外部循环:生成外部循环来循环访问 ourAnimals 数组中的动物。
- 数据检查:编写代码,用于检查现有宠物数据,如果宠物的数据存在,则显示宠物 ID。
- 内部循环:生成一个内部循环,该循环显示已分配数据的宠物的所有宠物特征。
- 验证测试:对在本练习中开发的代码执行验证测试。
重要
在开始本练习之前,必须先完成本模块中的上一个练习。
生成循环以循环访问 ourAnimals 数组
在此任务中,将创建用于循环访问 for 数组中的动物的外部 ourAnimals 循环。 检查数组的维度与循环参数 for 之间的关系。 在处理多维数组时,还需要考虑使用 for 语句和 foreach 语句之间的差异。
确保 Visual Studio Code 处于打开状态,并且Program.cs文件在编辑器中可见。
在选择语句的代码块
switch(menuSelection)中,找到以下代码行:case "1": // List all of our current pet information Console.WriteLine("this app feature is coming soon - please check back to see progress."); Console.WriteLine("Press the Enter key to continue."); readResult = Console.ReadLine(); break;删除显示“即将来临”消息的
Console.WriteLine()语句,并在// List all of our current pet information代码注释行下方留一个空的代码行。不需要反馈消息,因为你将显示数组的内容
ourAnimals。 开发与其他菜单选择对应的代码时,也会更新这些反馈消息。留下包含
Press the Enter key to continue.内容的信息从创建的空白代码行开始,开始一条
for语句,如下所示:for () { }花点时间考虑使用此
for语句需要实现的内容。回想一下,一个
for语句包含三个部分,用于控制其实现迭代的方式:for 初始值设定项、for 条件和for 迭代器。 分配给 初始值设定项、条件 和 迭代器 的值取决于您希望通过for语句实现的目标。在这种情况下,循环
for用于循环访问ourAnimals数组。 你知道数组使用从零开始的索引,这意味着一个包含n个元素的数组,其索引范围是从0到n-1。 需要 初始值设定项、 条件和 迭代器 才能匹配数组的维度。 在这种情况下,希望for循环从0开始,以1递增,并在maxPets-1结束。你的数组
ourAnimals被声明如下:string[,] ourAnimals = new string[maxPets, 6];你知道分配给maxPets的值是8。 在此声明中,maxPets指定数组第一个维度中的元素数,而不是用于引用数组中的元素的从零开始的索引号。 因此,尽管maxPets = 8,数组索引号的范围是从0到7。若要指定循环的控制
for值,请按如下所示更新代码:for (int i = 0; i < maxPets; i++) { }可以看到,将 for initializer 设置为 与从零开始的数组索引相一致
int i = 0;。 同样,将for条件设置为i < maxPets;与数组的第一个维度对齐。 最后,将for迭代器设置为i++,这样每次迭代都会使循环控制值增加1。在循环访问 ourAnimals 数组时,花一分钟时间考虑是选择
for语句还是foreach语句。目标是逐个迭代处理我们的动物数组中的每个动物。 那么,为什么不使用
foreach循环? 毕竟,你知道,foreach语句是为需要遍历项目数组中的每个项目的情况而设计的。不使用
foreach循环的原因在于这种情况下ourAnimals数组是多维数组。 由于ourAnimals是多维字符串数组,因此所包含的ourAnimals每个元素都是字符串类型的单独项。 如果使用foreach循环遍历ourAnimals,那么foreach会将每个字符串识别为包含 48 个字符串项(8 x 6 = 48)的列表中的一个单独项。 该foreach语句不会单独处理两个数组维度。 换句话说,foreach循环无法识别8字符串元素的行,其中每行都包含一列6项。 由于你想要一次处理一个动物,并在一次迭代过程中处理所有六种动物特征,一个foreach语句不是正确的选择。但是,如果
ourAnimals数组是配置为字符串数组的交错数组,则可以使用foreach语句。 在这种情况下,你将为外部循环创建一个foreach,并为内部循环创建一个foreach。 外部循环将遍历交错数组中的“字符串数组”元素。 字符串数组是二维数组中的“行”。 内部循环将遍历字符串数组中的string元素。 字符串数组中的字符串元素是二维数组中的“列”。以下代码示例演示了锯齿形数组的方法。
string[][] jaggedArray = new string[][] { new string[] { "one1", "two1", "three1", "four1", "five1", "six1" }, new string[] { "one2", "two2", "three2", "four2", "five2", "six2" }, new string[] { "one3", "two3", "three3", "four3", "five3", "six3" }, new string[] { "one4", "two4", "three4", "four4", "five4", "six4" }, new string[] { "one5", "two5", "three5", "four5", "five5", "six5" }, new string[] { "one6", "two6", "three6", "four6", "five6", "six6" }, new string[] { "one7", "two7", "three7", "four7", "five7", "six7" }, new string[] { "one8", "two8", "three8", "four8", "five8", "six8" } }; foreach (string[] array in jaggedArray) { foreach (string value in array) { Console.WriteLine(value); } Console.WriteLine(); }对于 Contoso Pets 应用程序,使用多维字符串数组和嵌套
for循环,而不是交错数组和嵌套foreach循环,可能更容易。 现在,你可以看到每个选项的工作原理,你可以在未来的编码项目中做出自己的选择。在 Visual Studio Code 的“文件”菜单上,选择“保存”。
在 Visual Studio Code 中打开集成终端面板,并输入用于生成程序的命令。
若要从 EXPLORER 视图中打开“集成终端”,请右键单击 “初学者”,然后选择“ 在集成终端中打开”。 还可以使用 “视图 ”或“ 终端 ”菜单打开“集成终端”面板。
若要生成程序,请从终端命令提示符输入
dotnet build命令。修复任何报告的构建错误或警告,然后再继续。
请记住,生成错误和警告消息会告知问题所在以及可在何处找到问题。 解决问题时,最好从代码顶部附近的问题开始,并逐步向下解决。
关闭“终端”面板。
检查现有宠物数据并显示结果
在此任务中,使用 if 语句查找已分配宠物特征数据的数组中的每个 ourAnimals 宠物。 找到具有已分配数据的宠物时,将显示 petID。 如果未分配任何数据,则不显示任何数据。 运行代码以验证你 for 和 if 语句是否正常工作。
在语句代码块中创建
for空白代码行,如下所示:for (int i = 0; i < maxPets; i++) { }若要创建用于
if检查宠物 ID 数据的语句,请按如下所示更新代码:for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { } }花一分钟时间来考虑此
if语句正在评估的内容以及原因。首先,考虑表达式左侧:
ourAnimals[i, 0]请注意,循环控制变量i用于指定正在检查的动物。 如你所记,0在[i, 0]中对应于petID特征。 由于数组的第一个维度对应于动物的“数字”,因此表达式的这一侧可确保代码检查分配给数组中每个动物的值petID。其次,请考虑比较运算符的选择。 请注意,正在使用不相等运算符
!=。 表达式的计算结果为true,只要分配给 petID 的值ourAnimals[i, 0]不等于等式右侧所列出的值。第三,考虑公式右侧的值。 请注意,使用了静态字符串值
"ID #: "。 这是在生成示例数据时分配给petID的默认值。 分配特征给动物时,petID值会被更新,并且不会等于默认值。这表明
if语句的代码块将在当前动物定义了特征后执行。注释
对于何时
!=应使用,这是一个很好的示例。 只要值不是默认值,就不关心分配给petID什么值。若要创建在
Console.WriteLine()语句的代码块内显示petID的if方法,请按如下所示更新代码:for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); } }请注意,在调用
WriteLine()方法时,数组元素可用作参数。在 Visual Studio Code 的“文件”菜单上,选择“保存”。
打开集成终端面板并输入用于生成程序的命令。
修复任何报告的构建错误或警告,然后再继续。
在终端命令提示符处,输入用于运行程序的命令。
在
dotnet run终端命令提示符处输入命令以运行程序代码。如果代码生成运行时错误,请修复错误、保存更新并重启应用程序。
在终端命令提示符处,若要验证新代码逻辑是否按预期工作,请输入 1
应看到显示以下
petID值:ID #: d1 ID #: d2 ID #: c3 ID #: c4 Press the Enter key to continue.这些 ID 对应于已分配数据的宠物。
如果在选择菜单选项 1 时代码显示不同的输出,请查看并更新代码。 请记住,在进行更新后,需要保存Program.cs文件。
退出应用程序,然后关闭终端面板。
显示已分配数据的宠物的所有宠物特征
在此任务中,你将在for语句的代码块中创建一个if循环,用于显示当前宠物的所有特征。
在代码编辑器中,在Program.cs文件中找到以下代码行:
for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); } }若要创建
for循环以遍历每个宠物的特征,请按如下所示更新代码:for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); for (int j = 0; j < 6; j++) { } } }请注意,现在第二
for个循环在第一个循环的代码块for内“嵌套”了。 如你所知,外部循环会循环访问ourAnimals数组中的动物。 目的是让内部循环循环访问每个动物的特征。 由于动物数据存储在多维数组中,因此可以轻松访问动物特征。花一分钟时间查看输入的
for语句。请注意,循环控件变量命名
j。 当您嵌套for循环时,一种常规方法是在外部循环中使用i,而在内部循环中使用j。 按照这样的约定,其他人可以更轻松地读取代码。由于每个动物存储了六个特征,因此for初始化器是
int j = 0;,for条件表达式是j < 6;。 初始值设定项和条件的组合与所需的0-5数组索引范围匹配。若要在单独的行上显示宠物的每个特征,请按如下所示更新代码:
for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(ourAnimals[i, 0]); for (int j = 0; j < 6; j++) { Console.WriteLine(ourAnimals[i, j]); } } }花点时间考虑已创建的嵌套结构以及代码将生成的显示输出。
请注意,写入控制台
ourAnimals[i, j]的值使用外部循环和内部for循环中的循环控件变量。你了解以下每个项:
- 数组的第一个维度
ourAnimals对应于不同的宠物。 - 数组的第
ourAnimals二个维度对应于每个宠物的特征。 - 当没有分配给当前宠物的宠物数据时,该
if语句可防止内部循环运行。 - 内部循环在外部循环的每次迭代中完成所有步骤。
因此,你知道每个动物的特征都会按预期显示。
- 数组的第一个维度
若要将 petID 消息替换为空白
WriteLine(),请按如下所示更新代码:for (int i = 0; i < maxPets; i++) { if (ourAnimals[i, 0] != "ID #: ") { Console.WriteLine(); for (int j = 0; j < 6; j++) { Console.WriteLine(ourAnimals[i, j]); } } }通过此最终更新,当输出显示到控制台时,可以更轻松地查看宠物之间的差别。
在 Visual Studio Code 的“文件”菜单上,选择“保存”。
打开终端窗格并生成程序。
修复任何报告的构建错误或警告,然后再继续。
检查你的工作
在此任务中,你将从集成终端运行应用程序,并验证嵌套组合 for 和 if 语句是否生成预期结果。
如有必要,打开 Visual Studio Code 的集成终端面板。
在终端命令提示符处,输入 dotnet run
在终端命令提示符处,输入 1
验证是否已为已分配数据的四只宠物显示宠物数据。
ID #: d1 Species: dog Age: 2 Nickname: lola Physical description: medium sized cream colored female golden retriever weighing about 65 pounds. housebroken. Personality: loves to have her belly rubbed and likes to chase her tail. gives lots of kisses. ID #: d2 Species: dog Age: 9 Nickname: loki Physical description: large reddish-brown male golden retriever weighing about 85 pounds. housebroken. Personality: loves to have his ears rubbed when he greets you at the door, or at any time! loves to lean-in and give doggy hugs. ID #: c3 Species: cat Age: 1 Nickname: Puss Physical description: small white female weighing about 8 pounds. litter box trained. Personality: friendly ID #: c4 Species: cat Age: ? Nickname: Physical description: Personality: Press the Enter key to continue.注释
如果未显示预期结果,请确保保存更新Program.cs文件。 如果未看到预期结果,并且无法识别问题,则可以检查最终文件夹中的Program.cs代码。 Final 文件夹包含在安装过程中完成的下载内容中。 建议在检查最终文件夹中Program.cs文件之前,花时间尝试识别和修复代码中的语法和逻辑问题。
退出应用程序,然后关闭终端面板。