练习 - 添加狗搜索

已完成

在本练习中,将功能“显示具有指定特征的所有狗”(菜单项 #2)添加到应用程序。 该练习使用上一练习中添加 suggestedDonation 数据的解决方案项目。

注释

此项目是“最小可行产品”(MVP)功能。 MVP 功能旨在成为功能的基本工作原型,可实现快速轻松地交付。 MVP 通常不是最终产品,其用途是帮助你完成想法、测试并收集进一步的要求。

搜索功能将提示用户输入一个搜索词(或短语),描述希望在待领养宠物中找到的特征。 然后,搜索可领养狗的描述,以寻找与用户输入完全匹配的内容。 有关匹配的狗的信息将输出到控制台。 如果未识别任何匹配项,则会显示一条消息 “我们的狗不是匹配项” ,以及使用的搜索词。

在本练习中完成的任务如下:

  1. 收集宠物特征搜索词的用户输入
  2. 循环浏览动物数组并识别“狗”
  3. 在每只狗的宠物描述中搜索术语匹配
  4. 显示具有字词匹配内容的狗狗

在 Visual Studio Code 中,打开上一练习中已完成并添加了捐款信息的 Project.cs 文件,以便开始当前任务。

  1. 查看 Project.cs 代码中注释 #5 之后的菜单切换语句。 你发现显示 “UNDER CONSTRUCTION” 消息的代码。

  2. 删除Console.WriteLine("\nUNDER CONSTRUCTION - please check back next month to see progress.");case "2":语句之间的代码Console.WriteLine("Press the Enter key to continue.");,以使代码符合以下示例:

    case "2":
        // Display all dogs with a specified characteristic
        Console.WriteLine("Press the Enter key to continue.");
        readResult = Console.ReadLine();
        break; 
    
  3. 添加代码以收集 dogCharacteristic 字符串的用户输入。 收集输入需要一个 while 循环,该循环会继续提示用户,直到他们提交输入。 循环指示用户 Enter one desired dog characteristic to search for。 输入空字符串将重复循环。 将以下代码 case "2: 放在语句前面 break; ,如下所示:

    case "2":
        // Display all dogs with a specified characteristic
        string dogCharacteristic = "";
    
        while (dogCharacteristic == "")
        {
            // have the user enter physical characteristics to search for
            Console.WriteLine($"\nEnter one desired dog characteristics to search for");
            readResult = Console.ReadLine();
            if (readResult != null)
            {
                dogCharacteristic = readResult.ToLower().Trim();
            }
        } 
        Console.WriteLine("Press the Enter key to continue.");
        readResult = Console.ReadLine();
        break;
    

    查看添加的代码。 case "2": 代码的主要功能包括:

    • 代码以字符串声明string dogCharacteristic = "";开头,该字符串的范围限制为case "2":。 不能在 case 语句代码之外的任何位置使用 dogCharacteristic
    • Console.ReadLine() 将用户输入收集为 dogCharacteristic 后,它会确保值不为 null,且将字符串设置为小写并剪裁周围的空格。
    • 如果 dogCharacteristic 值为 null,则循环将重复收集输入。
  4. 保存代码,然后使用终端进行编译 dotnet build (可以参考上一练习中的步骤),并修复任何错误。

  5. 使用 dotnet run 运行代码。

  6. 若要测试应用的搜索词输入功能,请输入 2,选择“菜单选项 2”进行搜索。

  7. “输入所需狗特征搜索”提示处按“Enter”,而不输入数据。 程序应返回到 Enter one desired dog characteristics to search for 提示。

  8. 程序应回到提示界面,直到用户输入字符为止。

  9. 在提示符下,使用 golden 作为条目来测试搜索词条目。 程序应返回菜单,而不会出错。

  10. 在菜单中,键入“Exit”退出程序。

确定哪些动物是狗

现在,在 dogCharacteristic 下的上述代码后添加使用狗狗描述内的用户输入 case "2" 来进行搜索的功能。 但首先,你需要识别狗。

  1. case "2" 代码的末尾,紧靠在代码 Console.WriteLine("\n\rPress the Enter key to continue");(位于 break; 之前)之前添加以下代码:

    // #6 loop through the ourAnimals array to search for matching animals
    for (int i = 0; i < maxPets; i++)
    {
        if (ourAnimals[i, 1].Contains("dog"))
        {
            // #7 Search combined descriptions and report results
        }
    }
    
  2. 花一分钟时间检查添加到代码末尾的 case "2": 循环。

    代码使用 ourAnimals[i,1] 对“狗”进行筛选,数据存储在 animalSpecies 中。 如果 animalSpecies 存储 “dog” 作为其值,则代码将移动到 if 语句的括号中,其中可以搜索合并的描述。

  3. 请使用 dotnet build 编译代码并修复任何错误。

搜索狗的综合描述信息

之前的代码确保您只搜索狗的相关描述。 现在,你需要搜索狗狗的说明,并输出有关匹配项的信息。

在考虑说明时,你意识到有两个描述:animalPhysicalDescriptionanimalPersonalityDescription;。 团队讨论该功能,并确定组合说明适用于搜索。

注释

一些开发人员将开发过程中需求的增加称为“范围蔓延”。虽然合并描述的工作不多,但它仍然增加了时间和复杂性。 因此,你应该让团队知道添加的要求通常会延迟项目完成。

需要声明一个字符串 dogDescription 来保存从 animalPhysicalDescriptionanimalPersonalityDescription; 合并而来的数据。

  1. 使用以下代码在注释 #6 之前声明 dogDescription

    string dogDescription = "";
    

    现在,使用前面声明的 dogDescription 字符串,并为每个动物填充物理和个性说明

  2. 使用 dogDescriptionanimalPhysicalDescription 的值填充 animalPersonalityDescription; 变量。

    在注释 #7 后添加以下代码:

    dogDescription = ourAnimals[i, 4] + "\n" + ourAnimals[i, 5];
    

搜索狗狗的组合描述并显示

现在,在合并后的dogCharacteristic数据中添加对dogDescription的搜索。 你需要添加if语句,以确定是否针对每只狗的搜索有匹配项。

  1. 使用以下代码更新注释 #7 之后(dogDescription = ourAnimals[i, 4] + "\n" + ourAnimals[i, 5]; 后)的代码:

    if (dogDescription.Contains(dogCharacteristic))
    {
        Console.WriteLine($"\nOur dog {ourAnimals[i, 3]} is a match!");
        Console.WriteLine(dogDescription);
    }
    

    检查前面的代码示例,当 if 语句在 dogCharacteristic 中找到 dogDescription 的匹配项时,系统会将有关狗匹配项和说明的消息输出到控制台。 还需要考虑“未找到匹配项”消息。

  2. 添加代码 noMatchesDog = true

    在注释 #6 之前添加以下代码:

    bool noMatchesDog = true;
    

    现在,您可以使用此跟踪变量来跟踪未找到匹配项的情况。 当默认值设置为true时,这意味着“确实没有狗与搜索匹配”。现在,当找到一只狗时,你可以将noMatchesDogtrue“翻转”到false

  3. 在语句的 if (dogDescription.Contains(dogCharacteristic)) 括号中,添加以下代码:

    noMatchesDog = false;
    
  4. 查看输入方括号 if (dogDescription.Contains(dogCharacteristic)) 中的代码是否正确。

    您应有以下代码:

        if (dogDescription.Contains(dogCharacteristic))
        {
            Console.WriteLine($"\nOur dog {ourAnimals[i, 3]} is a match!");
            Console.WriteLine(dogDescription);
    
            noMatchesDog = false;
        }
    

    最后,需要创建一个代码,该代码决定是否应将“找不到匹配项”消息写入控制台。

  5. case "2" 代码的末尾,紧靠在代码 Console.WriteLine("\n\rPress the Enter key to continue");(位于 break; 之前)之前添加以下代码:

    if (noMatchesDog)
    {
        Console.WriteLine("None of our dogs are a match found for: " + dogCharacteristic);
    }
    
    

    此代码示例是本练习的最终代码!

  6. 保存更改。

检查你的工作

  1. 在 TERMINAL 命令提示符处,若要生成项目代码,请输入以下命令: dotnet build

    如果存在错误,则需要阅读错误消息、解决问题并修复或查看“最终”文件夹中的解决方案代码。

  2. 使用 dotnet run. 在终端中运行项目代码。

代码运行后,将显示两个菜单项。

  1. 在菜单中,输入“2”并按“Enter”以重复测试狗狗搜索。

     - Enter nothing as input to test the null entry behavior
     - Enter "scuba" as input to test the "match not found"
     - Enter "golden" to get two matches
     - Enter "medium" to get one match
    

    如果这两个步骤都按预期工作,恭喜! 否则的话,请检查练习步骤以查找错误。 请根据需要重新开始或查看“Final”文件夹代码以获取本练习的解决方案代码。

  2. 在应用菜单中键入 exit 来结束程序,然后关闭终端面板。