查看实现 do 与 while 挑战活动的解决方案

已完成

以下示例应使用 do,因为你知道至少需要执行一次代码块。 也可以使用 while 来实现相同的结果。 一些开发人员认为 while 的逻辑使代码更具可读性。 如果你也这样认为,可以选择实现 while。 在这种情况下,请注意大多数代码编译器会通过将迭代语句转换为 do-while 来为你优化代码。

项目 1 代码

以下代码是上一单元中所述挑战项目 1 的一种可能的解决方案。

代码使用 do 语句,因为必须至少执行一次代码块。 也可以使用 while 来实现相同的结果。 一些开发人员可能认为 while 的逻辑使代码更具可读性。 如果你也这样认为,可以选择在此处实现 while 语句。

string? readResult;
string valueEntered = "";
int numValue = 0;
bool validNumber = false;

Console.WriteLine("Enter an integer value between 5 and 10");

do
{
    readResult = Console.ReadLine();
    if (readResult != null) 
    {
        valueEntered = readResult;
    }

    validNumber = int.TryParse(valueEntered, out numValue);

    if (validNumber == true)
    {
        if (numValue <= 5 || numValue >= 10)
        {
            validNumber = false;
            Console.WriteLine($"You entered {numValue}. Please enter a number between 5 and 10.");
        }
    }
    else 
    {
        Console.WriteLine("Sorry, you entered an invalid number, please try again");
    }
} while (validNumber == false);

Console.WriteLine($"Your input value ({numValue}) has been accepted.");

readResult = Console.ReadLine();

项目 2 代码

以下代码是上一单元中所述挑战项目 2 的一种可能的解决方案。

代码使用 do 语句,因为必须至少执行一次代码块。 也可以使用 while 来实现相同的结果。 一些开发人员可能认为 while 的逻辑使代码更具可读性。 如果你也这样认为,可以选择在此处实现 while 语句。

string? readResult;
string roleName = "";
bool validEntry = false;

do
{                
    Console.WriteLine("Enter your role name (Administrator, Manager, or User)");
    readResult = Console.ReadLine();
    if (readResult != null) 
    {
        roleName = readResult.Trim();
    }

    if (roleName.ToLower() == "administrator" || roleName.ToLower() == "manager" || roleName.ToLower() == "user") 
    {
        validEntry = true;
    }
    else
    {
        Console.Write($"The role name that you entered, \"{roleName}\" is not valid. ");
    }

} while (validEntry == false);

Console.WriteLine($"Your input value ({roleName}) has been accepted.");
readResult = Console.ReadLine();

项目 3 代码

以下代码是上一单元中所述挑战项目 3 的一种可能的解决方案。

代码对外部循环使用 for 语句,因为无法修改分配给“foreach 迭代变量”的值。 可以通过在 foreach 循环内声明其他字符串变量来解决此问题,但这样会为代码逻辑增加不必要的复杂性。 换句话说,如果使用迭代语句 foreach (string myString in myStrings),然后尝试处理 myString 变量,则会产生编译错误。

代码对内部循环使用 while 语句,因为根据数据字符串的值,可能不会执行代码块(当字符串不包含句点时)。 在可能不需要执行迭代块的情况下,不应使用 do 语句。

string[] myStrings = new string[2] { "I like pizza. I like roast chicken. I like salad", "I like all three of the menu choices" };
int stringsCount = myStrings.Length;

string myString = "";
int periodLocation = 0;

for (int i = 0; i < stringsCount; i++)
{
    myString = myStrings[i];
    periodLocation = myString.IndexOf(".");

    string mySentence;

    // extract sentences from each string and display them one at a time
    while (periodLocation != -1)
    {

        // first sentence is the string value to the left of the period location
        mySentence = myString.Remove(periodLocation);

        // the remainder of myString is the string value to the right of the location
        myString = myString.Substring(periodLocation + 1);

        // remove any leading white-space from myString
        myString = myString.TrimStart();

        // update the comma location and increment the counter
        periodLocation = myString.IndexOf(".");

        Console.WriteLine(mySentence);
    }
 
    mySentence = myString.Trim();
    Console.WriteLine(mySentence);
}

如果你成功了,那么祝贺你! 如果遇到问题,请花时间查看解决方案,并尝试理解其工作原理。