2017-06-12 95 views
0

我想知道是否有人可以帮助我。我对编程非常陌生,这是我第一次使用stackoverflow。c#while循环中断

我正在寻找创建一个while循环,要求用户输入背景,并且一旦输入正确以跳出循环。我可以使用break来退出,但我试图找到另一种方式。我的代码到目前为:

var background = ""; 

while (background != "M" || background != "W" || background != "R") 
{ 
    Console.WriteLine("Welcome " + name + ", " + "Please pick a class: \n" + 
           "(M)age \n" + 
           "(W)arrior \n" + 
           "(R)ogue \n"); 
    var readLine = Console.ReadLine(); 
    if (readLine != null) background = readLine.ToUpper(); 

    if (background == "M") 
    { 
     Console.WriteLine("Welcome Mage " + name);    
    } 
    else if (background == "W") 
    { 
     Console.WriteLine("Welcome Warrior " + name);      
    } 
    else if (background == "R") 
    { 
     Console.WriteLine("Welcome Rogue " + name); 
    } 
    else 
    { 
     Console.WriteLine("Invalid choice"); 
    } 
} 
+1

break有什么问题? – JJJ

+1

@JJJ - 一般而言,具有一个入口和一个出口的控制结构更容易理解,与单一入口/单出口规则相关。 – hatchet

+0

对我来说,当我提出了一个应该停止循环的条件时,我仍然不得不休息一下才得到它。首先要具备条件的重点是什么?好吧,我的病情是错的,为什么我被卡住了。 –

回答

5

“||”是“还是”。您的while表达式将始终为真,因为背景总是不是“M”,它不是“W”,它不是“R”。

随着“或”全部三个检查必须有假整个表达式是假的,但至少其中的两个“!=”的子表达式必须的始终是真实的在任何时间。如果background是“M”,则它不能是“W”或“R”。

while (background != "M" || background != "W" || background != "R") 

你想要的是“& &”,意为“和”:你想继续循环,而背景是不是“M” 背景不是“W”等

while (background != "M" && background != "W" && background != "R") 
+0

这是有道理的。非常感谢你。 –

+1

@SerbjitKang如果这回答了你的问题,请确保你使这个接受的答案 –

+1

@SerbjitKang我的荣幸。 Tyler Gaffaney编写循环的方式也是一个好主意,但我认为了解你的错在哪里会有帮助。 –

0

使用'标志'来指定循环是否应该打破或不适用您的情况。

var background = ""; 
bool breakLoop = false; 

    while (!breakLoop) 
    { 
     Console.WriteLine("Welcome " + name + ", " + "Please pick a class: \n" + 
          "(M)age \n" + 
          "(W)arrior \n" + 
          "(R)ogue \n"); 
     var readLine = Console.ReadLine(); 
     if (readLine != null) background = readLine.ToUpper(); 

     if (background == "M") 
     { 
      Console.WriteLine("Welcome Mage " + name); 
      breakLoop = true; 
     } 

     else if (background == "W") 
     { 
      Console.WriteLine("Welcome Warrior " + name); 
      breakLoop = true; 
     } 

     else if (background == "R") 
     { 
      Console.WriteLine("Welcome Rogue " + name); 
      breakLoop = true; 
     } 

     else 
      Console.WriteLine("Invalid choice"); 
    } 
+0

您的回答的第一句话似乎不正确。 – hatchet

+0

我删除它,因为它是混乱。 –

+0

谢谢。这看起来是一个很好的方法。 –

0

我个人喜欢创建一个接受的响应列表,并检查用户输入是否在该列表中。

var name = "Bob"; 
var validTypes = new List<string> {"M", "W", "R"}; 
while (true) 
{ 
    Console.WriteLine($"Welcome {name}, please pick a class" + 
         "\n(M)age" + 
         "\n(W)arrior" + 
         "\n(R)ogue" + 
         "\n"); 
    var charType = Console.ReadLine(); 

    if (validTypes.Contains(charType.ToUpper())) 
    { 
     break; 
    } 
    else 
    { 
     Console.WriteLine("Please enter a valid class letter"); 
    } 
+0

请注意,如果用户输入的东西不能做成ToUpper(),这段代码就不会考虑任何异常处理,当然这仅仅是为了举例。 – gilliduck