2017-06-12 201 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