练习 - 编写代码以显示 ourAnimals 数组中的所有数据

已完成

在本练习中,你将编写用于显示我们的Animals 数组信息的嵌套循环结构和选择代码块。 在本练习中完成的详细任务包括:

  1. 外部循环:生成外部循环来循环访问 ourAnimals 数组中的动物。
  2. 数据检查:编写代码,用于检查现有宠物数据,如果宠物的数据存在,则显示宠物 ID。
  3. 内部循环:生成一个内部循环,该循环显示已分配数据的宠物的所有宠物特征。
  4. 验证测试:对在本练习中开发的代码执行验证测试。

重要

在开始本练习之前,必须先完成本模块中的上一个练习。

生成循环以循环访问 ourAnimals 数组

在此任务中,将创建用于循环访问 for 数组中的动物的外部 ourAnimals 循环。 检查数组的维度与循环参数 for 之间的关系。 在处理多维数组时,还需要考虑使用 for 语句和 foreach 语句之间的差异。

  1. 确保 Visual Studio Code 处于打开状态,并且Program.cs文件在编辑器中可见。

  2. 在选择语句的代码块 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;
    
  3. 删除显示“即将来临”消息的Console.WriteLine()语句,并在// List all of our current pet information代码注释行下方留一个空的代码行。

    不需要反馈消息,因为你将显示数组的内容 ourAnimals 。 开发与其他菜单选择对应的代码时,也会更新这些反馈消息。

    留下包含Press the Enter key to continue.内容的信息

  4. 从创建的空白代码行开始,开始一条 for 语句,如下所示:

    for ()
    {
    }
    
  5. 花点时间考虑使用此 for 语句需要实现的内容。

    回想一下,一个for语句包含三个部分,用于控制其实现迭代的方式:for 初始值设定项for 条件for 迭代器。 分配给 初始值设定项条件迭代器 的值取决于您希望通过 for 语句实现的目标。

    在这种情况下,循环 for 用于循环访问 ourAnimals 数组。 你知道数组使用从零开始的索引,这意味着一个包含 n 个元素的数组,其索引范围是从 0n-1。 需要 初始值设定项、 条件迭代器 才能匹配数组的维度。 在这种情况下,希望 for 循环从 0 开始,以 1 递增,并在 maxPets-1 结束。

    你的数组ourAnimals被声明如下:string[,] ourAnimals = new string[maxPets, 6]; 你知道分配给 maxPets 的值是 8。 在此声明中, maxPets 指定数组第一个维度中的元素数,而不是用于引用数组中的元素的从零开始的索引号。 因此,尽管maxPets = 8,数组索引号的范围是从07

  6. 若要指定循环的控制 for 值,请按如下所示更新代码:

    for (int i = 0; i < maxPets; i++)
    {
    }
    

    可以看到,将 for initializer 设置为 与从零开始的数组索引相一致int i = 0;。 同样,将for条件设置为i < maxPets;与数组的第一个维度对齐。 最后,将for迭代器设置为i++,这样每次迭代都会使循环控制值增加1

  7. 在循环访问 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循环,可能更容易。 现在,你可以看到每个选项的工作原理,你可以在未来的编码项目中做出自己的选择。

  8. 在 Visual Studio Code 的“文件”菜单上,选择“保存”。

  9. 在 Visual Studio Code 中打开集成终端面板,并输入用于生成程序的命令。

    若要从 EXPLORER 视图中打开“集成终端”,请右键单击 “初学者”,然后选择“ 在集成终端中打开”。 还可以使用 “视图 ”或“ 终端 ”菜单打开“集成终端”面板。

    若要生成程序,请从终端命令提示符输入 dotnet build 命令。

  10. 修复任何报告的构建错误或警告,然后再继续。

    请记住,生成错误和警告消息会告知问题所在以及可在何处找到问题。 解决问题时,最好从代码顶部附近的问题开始,并逐步向下解决。

  11. 关闭“终端”面板。

检查现有宠物数据并显示结果

在此任务中,使用 if 语句查找已分配宠物特征数据的数组中的每个 ourAnimals 宠物。 找到具有已分配数据的宠物时,将显示 petID。 如果未分配任何数据,则不显示任何数据。 运行代码以验证你 forif 语句是否正常工作。

  1. 在语句代码块中创建 for 空白代码行,如下所示:

    for (int i = 0; i < maxPets; i++)
    {
    
    }    
    
  2. 若要创建用于 if 检查宠物 ID 数据的语句,请按如下所示更新代码:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
        }
    }    
    
  3. 花一分钟时间来考虑此 if 语句正在评估的内容以及原因。

    首先,考虑表达式左侧: ourAnimals[i, 0] 请注意,循环控制变量 i 用于指定正在检查的动物。 如你所记,0[i, 0] 中对应于 petID 特征。 由于数组的第一个维度对应于动物的“数字”,因此表达式的这一侧可确保代码检查分配给数组中每个动物的值 petID

    其次,请考虑比较运算符的选择。 请注意,正在使用不相等运算符 !=。 表达式的计算结果为 true ,只要分配给 petID 的值 ourAnimals[i, 0] 不等于等式右侧所列出的值。

    第三,考虑公式右侧的值。 请注意,使用了静态字符串值 "ID #: " 。 这是在生成示例数据时分配给 petID 的默认值。 分配特征给动物时,petID 值会被更新,并且不会等于默认值。

    这表明 if 语句的代码块将在当前动物定义了特征后执行。

    注释

    对于何时 != 应使用,这是一个很好的示例。 只要值不是默认值,就不关心分配给 petID 什么值。

  4. 若要创建在 Console.WriteLine() 语句的代码块内显示 petIDif 方法,请按如下所示更新代码:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine(ourAnimals[i, 0]);
        }
    }    
    

    请注意,在调用 WriteLine() 方法时,数组元素可用作参数。

  5. 在 Visual Studio Code 的“文件”菜单上,选择“保存”。

  6. 打开集成终端面板并输入用于生成程序的命令。

  7. 修复任何报告的构建错误或警告,然后再继续。

  8. 在终端命令提示符处,输入用于运行程序的命令。

    dotnet run 终端命令提示符处输入命令以运行程序代码。

    如果代码生成运行时错误,请修复错误、保存更新并重启应用程序。

  9. 在终端命令提示符处,若要验证新代码逻辑是否按预期工作,请输入 1

    应看到显示以下 petID 值:

    ID #: d1
    ID #: d2
    ID #: c3
    ID #: c4
    Press the Enter key to continue.
    

    这些 ID 对应于已分配数据的宠物。

    如果在选择菜单选项 1 时代码显示不同的输出,请查看并更新代码。 请记住,在进行更新后,需要保存Program.cs文件。

  10. 退出应用程序,然后关闭终端面板。

显示已分配数据的宠物的所有宠物特征

在此任务中,你将在for语句的代码块中创建一个if循环,用于显示当前宠物的所有特征。

  1. 在代码编辑器中,在Program.cs文件中找到以下代码行:

    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 0] != "ID #: ")
        {
            Console.WriteLine(ourAnimals[i, 0]);
        }
    }    
    
  2. 若要创建 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 数组中的动物。 目的是让内部循环循环访问每个动物的特征。 由于动物数据存储在多维数组中,因此可以轻松访问动物特征。

  3. 花一分钟时间查看输入的 for 语句。

    请注意,循环控件变量命名 j。 当您嵌套 for 循环时,一种常规方法是在外部循环中使用 i,而在内部循环中使用 j。 按照这样的约定,其他人可以更轻松地读取代码。

    由于每个动物存储了六个特征,因此for初始化器int j = 0;for条件表达式j < 6;。 初始值设定项和条件的组合与所需的 0 - 5数组索引范围匹配。

  4. 若要在单独的行上显示宠物的每个特征,请按如下所示更新代码:

    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]);
            }
        }
    }    
    
  5. 花点时间考虑已创建的嵌套结构以及代码将生成的显示输出。

    请注意,写入控制台 ourAnimals[i, j]的值使用外部循环和内部 for 循环中的循环控件变量。

    你了解以下每个项:

    • 数组的第一个维度 ourAnimals 对应于不同的宠物。
    • 数组的第 ourAnimals 二个维度对应于每个宠物的特征。
    • 当没有分配给当前宠物的宠物数据时,该 if 语句可防止内部循环运行。
    • 内部循环在外部循环的每次迭代中完成所有步骤。

    因此,你知道每个动物的特征都会按预期显示。

  6. 若要将 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]);
            }
        }
    }    
    

    通过此最终更新,当输出显示到控制台时,可以更轻松地查看宠物之间的差别。

  7. 在 Visual Studio Code 的“文件”菜单上,选择“保存”。

  8. 打开终端窗格并生成程序。

  9. 修复任何报告的构建错误或警告,然后再继续。

检查你的工作

在此任务中,你将从集成终端运行应用程序,并验证嵌套组合 forif 语句是否生成预期结果。

  1. 如有必要,打开 Visual Studio Code 的集成终端面板。

  2. 在终端命令提示符处,输入 dotnet run

  3. 在终端命令提示符处,输入 1

  4. 验证是否已为已分配数据的四只宠物显示宠物数据。

    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文件之前,花时间尝试识别和修复代码中的语法和逻辑问题。

  5. 退出应用程序,然后关闭终端面板。