对于循环超出范围

时间:2016-07-14 16:35:14

标签: c#

我遇到了这个我需要解决的问题,由于某种原因,我无法理解为什么今天没有这个问题。

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

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?>

1 个答案:

答案 0 :(得分:5)

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

E.g。如果你有一个包含10个元素的数组,那么它将经历三次循环,并且还有更多要处理的结尾,即第10个元素,但是第11个和第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循环中的count中减去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];
    [...]
}