首页 > 解决方案 > foreach循环内的递归

问题描述

我在循环中有重复 - 当isAllowed= true - 然后继续下一次迭代,但当isAllowed是 false - 然后程序应该重复生成随机位置、坐标并检查isAllowed直到是否为真。

如何在该循环中进行递归以实现此目标?

foreach (var fleet in groupedFleetsbySpaceshipCounts)
{
    var randomPositionX = new Random().Next(0, 9);
    var randomPositionY = new Random().Next(0, 9);

    var cords = int.Parse(randomPositionX.ToString() + randomPositionY);
    map.Location[cords].ActualFleetPosition = fleet.Key[i];
    var isAllowed = IsPositionAllowed(map, cords);
    if (isAllowed)
    {
        break;
    }
    else
    {
        randomPositionX = new Random().Next(0, 9);
        randomPositionY = new Random().Next(0, 9);

        cords = int.Parse(randomPositionX.ToString() + randomPositionY);
        map.Location[cords].ActualFleetPosition = fleet.Key[i];
        isAllowed = IsPositionAllowed(map, cords);
        if (isAllowed)
        {
            break;
        }
        else
        {
            //recursion
        }
    }
    i++;
}

标签: c#.netfor-looprecursion

解决方案


也许你想要这样的东西:

var random = new Random();
foreach (var fleet in groupedFleetsbySpaceshipCounts)
{
    int coords;
    do {
        int randomPositionX = random.Next(0, 9);
        int randomPositionY = random.Next(0, 9);

        coords = 10 * randomPositionX + randomPositionY;
    } while (!IsPositionAllowed(map, coords));

    map.Location[coords].ActualFleetPosition = fleet.Key[i++];
}

即,您不需要递归(即调用自身的方法),而是嵌套在第一个循环内的另一个循环。

请注意, 的最大值random.Next是独占的。因此,如果您想要最多的数字,9您必须使用 的上限值10。此外,如果较低的值是0,您可以简单地编写random.Next(10)

只创建一次对象很重要Random,否则您最终可能会使用不同的随机对象生成相同的伪随机序列。在类中使用静态字段甚至比使用局部变量更好

private static readonly _random = new Random();

推荐阅读