c# - 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++;
}
解决方案
也许你想要这样的东西:
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();
推荐阅读
- c - 在 Eclipse 上使用 GCov 时出现字符串命令错误
- python - 使用write函数写入文件python时出现断行
- reactjs - 在 ReactJs 组件中滚动到顶部
- azure - 带有 EntityFramework + DI 的 Azure 函数
- ios - ScrollViewDidScroll EXC_BREAKPOINT 仅在 iOS 13 上崩溃
- jupyter-notebook - 为什么 Jupyter Notebook 需要这么长时间才能加载?
- r - 如何在另一个向量R中找到一个向量中元素的索引
- django - Django 'NoneType' 对象没有属性 'amount'
- ios - iOS/Swift:如何混合多个 UIView
- javascript - webpack - ReferenceError: $ 未定义