2011-12-12 41 views
1

我有一個二維數組,它的一些成員是數字(playerID -1,2,3,4等),其餘都是零。建立一個FOR循環與幾個IF,並導致它只停止在一些運行

我想做一個循環包含各種檢查方法,通過循環,並返回一個答案。檢查是排名的,所以當更高的檢查之一返回TRUE時,該playerID的循環可以終止。後來我想用檢查結果來比較兩名球員之間的差異,但首先是第一件事 - 我無法獲得大的FOR循環。

我腦子裏想的是這樣的:

for (int playerID = 1; playerID <= participants; playerID++) 
{ 
    checkA = Check4forsequenceof4(matrix); //method A 
    if (checkA == 0) 
     continue; 
    else 
     Console.WriteLine(p + "completed check A"); 
     break; 
    if (checkB == 0) 
     continue; 
    else 
     Console.WriteLine(p + "completed check B"); 
     break; 
    if (checkC == 0) 
     continue; 
    else 
     Console.WriteLine(p + "completed check C"); 
     break; 
} 

的問題是:break中斷的FOR循環,而不是僅從如果,我想不出如何檢查下一playerID,並且也無法弄清楚如何最好地爲每個玩家存儲結果以供以後顯示。

+3

我認爲它燒燬了我的視網膜... :-)不習慣看到許多人繼續並在一個循環中斷開... –

+0

'break'不會像您注意到的那樣終止'if'。您可以嘗試將檢查放入播放器循環內的另一個「嵌套」循環中。 – David

+0

什麼是'break'?應該做什麼? – Rondel

回答

5

首先,如果你想使這個工作,你不能依靠壓痕 - 你需要括號:

 if (checkA == 0) 
      continue; 
     else 
     { 
      Console.WriteLine(p + "completed check A"); 
      break; 
     } 

這將解決立即打破了你的循環迫在眉睫的問題。

話雖這麼說,鑑於上述檢查,你將永遠不會檢查B.我懷疑你想反轉的邏輯,因爲這樣的:

 if (checkA != 0) 
     { 
      Console.WriteLine(p + "completed check A"); 
      break; 
     } 

這將導致checkA運行,然後checkB,等等。

+0

謝謝。我正在從Python轉移到C#,反之亦然,顯然兩者混合起來 – jonatr

0

我想這就是你要找的。雖然我不知道什麼時候checkB或C應該設置。 checkA檢查後?

for (int playerID = 1; playerID <= participants; playerID++) 
{ 
    checkA = Check4forsequenceof4(matrix); //method A 
    if (checkA == 0) 
     continue; 

    Console.WriteLine(p + "completed check A"); 

    if (checkB == 0) 
     continue; 
    Console.WriteLine(p + "completed check B"); 

    if (checkC == 0) 
      continue; 
    Console.WriteLine(p + "completed check C"); 
} 
+0

是的,在A和B之後。認爲這是我以後的事情,但我必須檢查。謝謝。 – jonatr

+0

@jonatr:唔......我不知道。這會在第一次遇到返回「false」的檢查時終止循環。也許這就是你想要的,但這不是你在問題中所說的。 –

+0

呃?它不會終止循環。它跳到下一個迭代。他說:「休息時間突破了FOR循環而不是僅僅從if」,所以我刪除了它們。 –

1

你有一個更大的問題。您的代碼讀取:

 checkA = Check4forsequenceof4(matrix); //method A 
     if (checkA == 0) 
      continue; 
     else 
      Console.WriteLine(p + "completed check A"); 
      break; 

這將總是跳出循環第一次checkA不爲0的那麼checkB將永遠不會被執行。

我不確定你要做什麼。代碼的縮進表示break在任何地方都是不必要的,因爲默認值是tao through(我認爲是你想要做的)。

+0

謝謝。我正在從Python轉移到C#,反之亦然,顯然我們都混在一起了。 – jonatr

0

除非我誤解你的問題:

for (int playerID = 1; playerID <= participants; playerID++) 
     { 
      checkA = Check4forsequenceof4(matrix); //method A 
      if (checkA != 0) 
       Console.WriteLine(p + "completed check A"); 
      else 
       continue; 

      if (checkB != 0) 
       Console.WriteLine(p + "completed check B"); 
      else 
       continue; 

      if (checkC != 0) 
       Console.WriteLine(p + "completed check C"); 
      else 
       continue; 

     } 
0

重塑你的if語句...

if (0 != checkValue) { 
    Console.WriteLine(p + " completed check X"); 
    Continue; 
} 

因此,這將導致循環進入下一次迭代時,校驗值是非零。

有沒有這樣的事情作爲if語句的突破。

1
var allPlayers = new List<Player>(); 
// Fill the list allPlayers here. 

var validPlayers = new List<Player>(); 
foreach (Player p in allPlayers) { 
    if(CheckA(p) || CheckB(p) || CheckC(p)) { 
     validPlayers.Add(p); 
    } 
} 

注意:c#執行所謂的短路評估。即如果CheckA返回true,則其他人將不再被評估。如果CheckB返回true,則不會評估CheckC。順便說一句「||」是一個邏輯或。如果所有檢查都必須正確,則改爲使用邏輯AND「& &」。這裏c#將在檢查失敗後立即停止檢查。

如果您只對首次返回true的支票感興趣,那麼只在支票正常時使用「繼續」,否則不支付「休息」。

我的答案可能不太合適,但我不確定你想要做什麼。

+0

感謝您的幫助,但正如您所看到的,我只是一個初學者 - 您答案中的一半元素對我來說有點像亂碼(但我理解了OR :))。謝謝。 – jonatr

0

我想出了以下代碼。

// This store all of the checks formed as Fun<Player, bool> delegates. 
var checks = new List<Func<Player, bool>>(); 

checks.Add(x => DoesPlayerSatisfyCheck1(x)); 
checks.Add(x => DoesPlayerSatisfyCheck2(x)); 
checks.Add(x => DoesPlayerSatisfyCheck3(x)); 
// Add more checks here if necessary. 

// This stores all players who have passed a check. 
// The first check that passed will be associated with that player. 
var results = new Dictionary<Player, int>(); 

// Loop through all players. 
foreach (Player p in participants) 
{ 
    // Now perform each test in order. 
    for (int i = 0; i < checks.Count; i++) 
    { 
    Func<Player, bool> checker = checks[i]; 
    if (checker(p)) 
    { 
     results.Add(p, i); 
     break; 
    } 
    } 
} 

這個代碼後執行results數據結構將包含每個Player途經的檢查之一的一個條目。該條目還將包含支票號碼。如果您希望稍後添加更多支票,則可以將其簡單地添加到checks數據結構中。

此代碼的行爲與您發佈的行爲不相同。但是,它的行爲符合你的要求;盡我所能告訴。