簡體   English   中英

如何從循環內的 If 語句中中斷 For 循環 (C#)

[英]How to Break a For Loop From an If Statement Inside the Loop (C#)

我正在研究使用自定義類而不是節點的 A* 尋路方法,但我的循環存在問題。 使用 int i 的第一個 for 循環最多可以達到 3(Player1.instance.movement = 3),但我需要在該循環內使用 if 語句來檢查是否已經找到目標位置。 我想知道當我的 If 語句為假時是否有可能打破我的 for 循環。 public void GetNeighbors(Tile originTile) { Tile originalTile = originTile;

    nextTile.Clear();
    int minX = 0;
    int minY = 0;
    var originCostFunc = Mathf.Infinity;

    for (int i = 0; i < Player1.instance.movement; i++)
    {
        for (int x = -1; x <= 1; x++)
        {
            for (int y = -1; y <= 1; y++)
            {
                if (x != y && y != x)
                {
                    var costX = Mathf.Abs((originTile.transform.position.x + x) - originalTile.transform.position.x);
                    var costY = Mathf.Abs((originTile.transform.position.y + y) - originalTile.transform.position.y);

                    var distanceX = Mathf.Abs(targetPos.transform.position.x - (originTile.transform.position.x + x));
                    var distanceY = Mathf.Abs(targetPos.transform.position.y - (originTile.transform.position.y + y));
                    var costFunc = costX + costY + distanceX + distanceY;

                    if (costFunc <= originCostFunc)
                    {
                        originCostFunc = costFunc;
                        minX = x;
                        minY = y;
                        Debug.Log($"x: {x}, y: {y}");
                    }
                }
            }
        }
        nextTile.Add(GridManagerHandPlaced.instance.GetTileAtPosition(new Vector2(originTile.transform.position.x + minX, originTile.transform.position.y + minY)));

        if (nextTile[i] != targetPos)
        {
            originTile = nextTile[i];
        }
        else
        {
            break;
        }

    }
    DisplayPath();
}

您可以按條件多次中斷循環。

bool breakLoop = false;

for (int i = 0; i < length; i++)
{
    for (int j = 0; j < length; j++)
    {
        for (int k = 0; k < length; k++)
        {
            breakLoop = nextTile == target;

            if (breakLoop)
                break;
        }

        if (breakLoop)
            break;
    }

    if (breakLoop)
        break;
}

或者將搜索邏輯移動到分離的方法並從任意數量的嵌套循環中返回一個值

string path = FindPath();
Display(path);

string FindPath()
{
    for (int i = 0; i < length; i++)
    {
        for (int j = 0; j < length; j++)
        {
            for (int k = 0; k < length; k++)
            {
                if (nextTile == target)
                    return nextTile;
            }
        }
    }

    return null;
}

永遠不要使用 goto 運算符。

這是我使用goto的少數有效案例之一。 事實上,這是文檔中給出的示例,說明何時應該使用它。

void CheckMatrices(Dictionary<string, int[][]> matrixLookup, int target)
{
    foreach (var (key, matrix) in matrixLookup)
    {
        for (int row = 0; row < matrix.Length; row++)
        {
            for (int col = 0; col < matrix[row].Length; col++)
            {
                if (matrix[row][col] == target)
                {
                    goto Found;
                }
            }
        }
        Console.WriteLine($"Not found {target} in matrix {key}.");
        continue;

    Found:
        Console.WriteLine($"Found {target} in matrix {key}.");
    }
}

請注意,標簽的語法就是myLabel:您可以將它放在程序可執行代碼中的任何位置。

為了涵蓋處理這種情況的其他方式,這里是布爾解決方案。

bool breakLoops = false;

for (int i = 0; i < length1; i++)
{
    for (int ii = 0; ii < length2; ii++)
    {
        for (int iii = 0; iii < length3; iii++)
        {
            if (breakingCondition)
            {
                breakLoops = true;
                break;
            }
        }
        if (breakLoops) break;
    }
    if (breakLoops) break;
}

簡單明了,但需要在要中斷的每個循環結束時進行中斷條件檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM