Ending a loop and returning to the previous loop

Hi there,

I’m facing a problem I’ve faced a few times in the past and have always been able to work around using the goto keyword, though I know this is a very bad habit to get into and I’m hoping someone might help suggest an alternate solution.

            //if TileSpace contains a tile conflicting with conditions, return
            for (int j = 0; j < baseContent.Count; j++)
            {
                if (baseTile.Contains(baseContent[j]) == baseContentCondition)
                {
                    goto End:
                }
            }

The code above checks a list of strings and if they meet a specified condition, the iteration of the initial loop ends, but I don’t know how to break from this loop and skip the code below without having a boolean check (ie if(baseTile.Contains(baseContent[j]) == baseContentCondition) is true, set a bool to true and break, and then check that bool to see whether to skip the rest of the code.

    private void ConditionalTilePlacement(string resourceName, int offsetX, int offsetY, bool baseContentCondition,  List<string> baseContent, bool targetContentCondition, List<string> targetContent)
    {
        int childCount = transform.childCount;

        //loop for all children of MapGen
        for (int i = 0; i < childCount; i++)
        {
            TileSpace baseTile = transform.GetChild(i).GetComponent<TileSpace>();

            //if TileSpace contains a tile conflicting with conditions, return
            for (int j = 0; j < baseContent.Count; j++)
            {
                if (baseTile.Contains(baseContent[j]) == baseContentCondition)
                {
                    goto End:
                }
            }

            //if target tilespaces does not exist, create new tile at target
            if (!tileSpaces[baseTile.X + offsetX, baseTile.Y + offsetY])
            {
                NewTile(baseTile.X + offsetX, baseTile.Y + offsetY);
            }
            
            //if Target TileSpace contains a tile conflicting with conditions, return
            for (int j2o = 0; j2o < targetContent.Count; j2o++)
            {
                if (tileSpaces[baseTile.X + offsetX, baseTile.Y + offsetY].Contains(targetContent[j2o]) != targetContentCondition)
                {
                    continue;
                }
            }

            //create tile on target, in tilespaces
            tileSpaces[baseTile.X + offsetX, baseTile.Y + offsetY].Add(m_resources.Get(resourceName), resourceName);

            End:
        }
    }

Bit of an odd question, but if anyone has any suggestions please let me know, and sorry if I’ve worded my question poorly.

1 Answer

1

Found a solution I’m comfortable with

            int err = 0;

            //if TileSpace contains a tile conflicting with conditions, return
            for (int j = 0; j < baseContent.Count; j++)
            {
                err += baseTile.Contains(baseContent[j]) == baseContentCondition ? 0 : 1;
            }

            if (err > 0)
                continue;