如何有效地打破C#中的双循环?

时间:2018-12-29 02:36:36

标签: c# loops

这是我目前用来打破双循环并继续执行DoStuff()的东西:

foreach (var enemyUnit in nearbyEnemyUnits) {
    var skip = false;
    foreach (var ownUnit in ownUnits) {
        if (ownUnit.EngagedTargetTag == enemyUnit.tag) {
            skip = true;
            break;
        }
    }

    if (skip) continue;

    DoStuff(enemyUnit);
}

整个“定义一个临时布尔变量以检查跳过”对我来说似乎很棘手。在像Go这样的语言中,我可以使用标签打破循环,甚至使内部循环成为Clojure的一部分。用C#做到这一点的最佳方法是什么?

我一直在像上面的示例一样长时间地进行操作,并且觉得必须有更好的方法-在这一点上几乎不敢问。

谢谢

3 个答案:

答案 0 :(得分:5)

您可以使用goto匿名方法,将其包装在方法中,或者使用C#7可以使用局部函数

static void Main(string[] args)
{
   void localMethod()
   {
      foreach (var enemyUnit in nearbyEnemyUnits)
         foreach (var ownUnit in ownUnits)
            if (ownUnit.EngagedTargetTag == enemyUnit.tag)
               return;
   }

   localMethod();
}

其他资源

答案 1 :(得分:3)

为什么只使用linq时为什么要使用goto

foreach (var enemyUnit in nearbyEnemyUnits.Where(e=>ownUnits.Any(e1=>e1.EngagedTargetTag == e.Tag) == false))
                DoStuff(enemyUnit);

答案 2 :(得分:1)

我上次使用goto无法告诉您,但是您可以使用C#。这是一个示例(末尾的归因链接):

public class GotoTest1
{
    static void Main()
    {
        int x = 200, y = 4;
        int count = 0;
        string[,] array = new string[x, y];

        // Initialize the array:
        for (int i = 0; i < x; i++)

            for (int j = 0; j < y; j++)
                array[i, j] = (++count).ToString();

        // Read input:
        Console.Write("Enter the number to search for: ");

        // Input a string:
        string myNumber = Console.ReadLine();

        // Search:
        for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < y; j++)
            {
                if (array[i, j].Equals(myNumber))
                {
                    goto Found;
                }
            }
        }

        Console.WriteLine("The number {0} was not found.", myNumber);
        goto Finish;

    Found:
        Console.WriteLine("The number {0} is found.", myNumber);

    Finish:
        Console.WriteLine("End of search.");


        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/goto