对于超出范围的循环
本文关键字:循环 范围 于超出 | 更新日期: 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];
[...]
}