对于超出范围的循环

本文关键字:循环 范围 于超出 | 更新日期: 2023-09-27 17:57:09

我遇到了这个问题,我需要解决,出于某种原因,我不明白为什么今天这不起作用。

所以我的问题是我正在尝试这样做:

for(int i = 0; i < _positions.Count; i+=3) {
   Vector3 v0 = _positions[i + 0];
   Vector3 v1 = _positions[i + 1];
   Vector3 v2 = _positions[i + 2];
   [...]  
} 

这是行不通的。 _postions 是 Vector3 的列表,其中 vector3 是具有 3 个浮点数的结构。问题是我可以让它工作

for (var i = 0; i < _indices.Count; i += 3) {
   int i0 = _indices[i].Value;
   int i1 = _indices[i + 1].Value;
   int i2 = _indices[i + 2].Value;
}

_indices是一个

List<int?>

对于超出范围的循环

您的循环代码很好,但它假设有问题的数组可以被 3 整除。如果还剩下 1 或 2 个剩余部分,那么您将尝试访问超出数组限制的元素。

例如,如果你有一个包含 10 个元素的数组,那么它将通过循环三次,最后还有更多元素需要处理,第 10 个元素,但是第 11 和第 12 个元素不存在,所以当你尝试访问这些元素时它会轰炸,因为你的代码假设它们存在。

在执行之前测试数组是否可以被 3 整除,或者只是确保它始终在您的代码中。

if (_positions.Count % 3 == 0)
{
    // Processing here e.g. ...
    for (int i = 0; i < _positions.Count; i+=3) {
        Vector3 v0 = _positions[i + 0];
        Vector3 v1 = _positions[i + 1];
        Vector3 v2 = _positions[i + 2];
        [...]
    }
}
else
{
    // Flag issue here, either on console or throw an exception...
    Console.WriteLine("Positions array length must be divisible by 3");
}

如果您希望忽略任何剩余值(其中的 1 或 2),则可以从 for 循环中的计数中减去 3 的模数,以确保 for 循环仅迭代 3 组而不使用较短的余数,静默忽略

差异

例如:

for (int i = 0; i < _positions.Count - (_positions.Count % 3); i+=3) {
    Vector3 v0 = _positions[i + 0];
    Vector3 v1 = _positions[i + 1];
    Vector3 v2 = _positions[i + 2];
    [...]
}