C# 使用多个IF构建FOR循环,并使其仅在某些运行中停止

C# 使用多个IF构建FOR循环,并使其仅在某些运行中停止,c#,arrays,loops,for-loop,C#,Arrays,Loops,For Loop,我有一个2D数组,它的一些成员是数字playerID-1,2,3,4等等,其余的是零 我想创建一个for循环,其中包含各种检查方法,这些方法通过该循环并返回一个答案。对检查进行排序,以便当其中一个较高的检查返回TRUE时,该playerID的循环可以终止。稍后,我想用检查结果来比较两名球员,但首先,我不能让大循环运行 我的想法是这样的: for (int playerID = 1; playerID <= participants; playerID++) { checkA = C

我有一个2D数组,它的一些成员是数字playerID-1,2,3,4等等,其余的是零

我想创建一个for循环,其中包含各种检查方法,这些方法通过该循环并返回一个答案。对检查进行排序,以便当其中一个较高的检查返回TRUE时,该playerID的循环可以终止。稍后,我想用检查结果来比较两名球员,但首先,我不能让大循环运行

我的想法是这样的:

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;
}

问题是:中断从FOR循环中中断,而不是仅从if中中断,我想不出如何检查下一个playerID,也想不出如何最好地存储每个玩家的结果以供以后显示。

我想这就是您要找的。虽然我不知道什么时候应该设置checkB或C。支票之后是支票吗

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");
}

我想这就是你要找的。虽然我不知道什么时候应该设置checkB或C。支票之后是支票吗

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");
}

首先,如果你想让这项工作顺利进行,你不能依赖缩进——你需要大括号:

        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等。首先,如果您想使此工作正常,您不能依赖缩进-您需要大括号:

        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运行,等等。

您有一个更大的问题。你的代码是:

        checkA = Check4forsequenceof4(matrix); //method A
        if (checkA == 0)
            continue;
        else
            Console.WriteLine(p + "completed check A");
            break;
当checkA第一次不是0时,它总是会跳出循环。所以checkB永远不会被执行


我不知道你想做什么。代码的缩进表明在任何地方都不需要中断,因为默认值是tao fall,我认为这是您想要做的。

您有一个更大的问题。你的代码是:

        checkA = Check4forsequenceof4(matrix); //method A
        if (checkA == 0)
            continue;
        else
            Console.WriteLine(p + "completed check A");
            break;
当checkA第一次不是0时,它总是会跳出循环。所以checkB永远不会被执行


我不知道你想做什么。代码的缩进表示在任何地方都不需要中断,因为默认值是tao fall,我认为这是您想要做的。

除非我误解了您的问题:

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;

        }

除非我误解了你的问题:

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;

        }

重组你的if语句

if (0 != checkValue) {
  Console.WriteLine(p + " completed check X");
  Continue;
}
因此,当检查值为非零时,这将导致循环进入下一次迭代


没有中断if语句的事情。

重新构造if语句

if (0 != checkValue) {
  Console.WriteLine(p + " completed check X");
  Continue;
}
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);
   }
}
因此,当检查值为非零时,这将导致循环进入下一次迭代

不存在中断if语句的情况

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。顺便说一下,| |是一个逻辑OR。如果所有检查都必须正常,则使用逻辑AND&&代替。这里c将在检查失败后立即停止检查

如果您只对哪个检查首先返回true感兴趣,则仅在检查正常时使用continue,否则不使用break

我的回答可能不太恰当,但我真的不确定你想做什么

注:c执行所谓的短路评估。也就是说,如果CheckA返回true,则将不再评估其他值。如果CheckB返回true,则不会计算CheckC。顺便说一下,| |是一个逻辑OR。如果所有检查都必须正常,则使用逻辑AND&&代替。这里c将在检查失败后立即停止检查

如果您只对哪个检查首先返回true感兴趣,则仅在检查正常时使用continue,否则不使用break


我的回答可能不太合适,但我不确定您想做什么。

我想出了以下代码

// 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;
    }
  }
}
此代码执行后,结果数据结构将包含通过其中一项检查的每个玩家的条目。该条目还将包含支票号码。如果以后要添加更多检查,只需将其添加到检查数据结构中即可


此代码的行为与您发布的代码不同。但是,它确实符合您提出的要求;无论如何,我只能说。

我想出了以下代码

// 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;
    }
  }
}
此代码执行后,结果数据结构将包含通过其中一项检查的每个玩家的条目。该条目还将包含支票号码。如果以后要添加更多检查,只需将其添加到检查数据结构中即可

这鳕鱼
e的行为与您发布的内容不同。但是,它确实符合您提出的要求;无论如何,我只能说。

我想它烧坏了我的视网膜不习惯看到许多循环在一个循环中继续和中断…中断不会终止if,正如您所注意到的。你可以尝试将支票放入另一个嵌套在玩家循环中的循环中;应该怎么做?断路器退出回路或开关箱。继续跳到下一个循环迭代。在“大循环”的上下文中,break将退出它,continue将跳到下一个玩家。现在还不清楚你到底想做什么。你可能想澄清一下,所以我们可以更好地建议你。你也可以考虑把玩家ID作为检查参数传递给你的检查例程。这将使每个玩家存储信息变得更容易。提示:要做到这一点,您需要存储一组值,而不仅仅是一个值。看起来你已经在使用这种结构了…我想它烧坏了我的视网膜不习惯看到许多循环在一个循环中继续和中断…中断不会终止if,正如您所注意到的。你可以尝试将支票放入另一个嵌套在玩家循环中的循环中;应该怎么做?断路器退出回路或开关箱。继续跳到下一个循环迭代。在“大循环”的上下文中,break将退出它,continue将跳到下一个玩家。现在还不清楚你到底想做什么。你可能想澄清一下,所以我们可以更好地建议你。你也可以考虑把玩家ID作为检查参数传递给你的检查例程。这将使每个玩家存储信息变得更容易。提示:要做到这一点,您需要存储一组值,而不仅仅是一个值。看起来你已经在使用这样的结构了…是的,在a和B之后。我想这就是我想要的,但我必须检查一下。谢谢。@jonatr:嗯……我不知道。这将在第一次遇到返回false的检查时终止循环。也许这就是你想要的,但那不是你在问题中说的。嗯?它不会终止循环。它跳到下一个迭代。他说中断是从FOR循环中断的,而不仅仅是从if循环中断的,所以我删除了它们。是的,在A和B之后。我想这就是我想要的,但我必须检查一下。谢谢。@jonatr:嗯……我不知道。这将在第一次遇到返回false的检查时终止循环。也许这就是你想要的,但那不是你在问题中说的。嗯?它不会终止循环。它跳到下一个迭代。他说中断是从FOR循环中中断的,而不仅仅是从if循环中中断的,所以我删除了它们。谢谢。我正在从python迁移到C,反之亦然,似乎两者都混淆了。谢谢。我正在从python迁移到C,反之亦然,似乎两者都混淆了。谢谢你的帮助,但正如你所看到的,我只是一个初学者-你的答案中有一半的元素目前对我来说有点像jibberish,但我理解OR:。谢谢。谢谢你的帮助,但正如你所看到的,我只是一个初学者——你的答案中有一半的元素目前对我来说有点像jibberish,但我理解OR:。谢谢,谢谢。我正在从python迁移到C,反之亦然,显然这两种方法的效果都不一样。我正在从python迁移到C,反之亦然,显然两者都混淆了