2011-12-12 42 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数据结构中。

此代码的行为与您发布的行为不相同。但是,它的行为符合你的要求;尽我所能告诉。