【问题标题】:c# Checking Index of Loop + Break Results in IndexOutOfRange? [closed]c#在IndexOutOfRange中检查循环+中断结果的索引? [关闭]
【发布时间】:2021-08-24 21:12:15
【问题描述】:

所以是的,这是一个简单的 IndexOutOfRange 异常——不要恨我。但是,我正在做的事情应该工作,但不是。我在 Unity 中使用 C#。我将不胜感激!

在下面的代码中,我需要访问列表中的下一个键。如果在 [i] 之后没有找到键,则从循环中中断。简单的...? 出于某种原因,它似乎没有进行检查。

for (int i = 0; i < keys.Count; i++)
{
    // if the number of keys is less than the hypothetical next index, then exit the loop
    if (keys.Count < i + 1)
        break;

    // I am getting the error for this line
    Key nextKey = keys[i + 1];
    // do something with nextKey...

 }

我确信有人会建议在 for 循环中只执行 keys.Count-1,但是当我这样做时,我的脚本的其他部分无法按预期工作。必须有另一种方式,对吧?也许我忽略了一些简单的事情。

感谢您的建议!

【问题讨论】:

  • 检查循环。您声明“i”,但随后在评估中使用“k”
  • 可以将你的 if 改写为if (i + 1 &gt;= keys.Count) break;
  • 为什么你认为它“应该工作”?对于 i 的什么值,您的逻辑失败了?你明白为什么吗?
  • 好像你写错了if (keys.Count &lt; i + 1),而你的意思是if (keys.Count &lt;= i + 1)
  • @Ruzihm 或者实际上是为了可读性我总是写if(i + 1 &gt;= key.Count) 或者干脆if(i == key.Count - 1)

标签: c# for-loop unity3d indexoutofrangeexception


【解决方案1】:

你的错误原因在于这个逻辑:

if (keys.Count < i + 1) break;
Key nextKey = keys[i + 1];

如果我们记得数组是从零开始的,并且最大索引比数组的长度小 1,那么就很清楚了。

让我们假装keys.Count == 10i == 9。由于10 不小于9 + 1,我们不打break 行。但随后我们尝试访问索引9 + 1,它超出了数组的范围。


要解决这个问题,我们需要检查当前键之后是否有另一个可用的键。由于最大索引是keys.Count - 1,如果i 大于或等于该值,我们可以添加break 语句(正如@derHugo 在cmets 中提到的,i 永远不会大于该值,除非我们在循环中对其进行了修改):

for (int i = 0; i < keys.Count; i++)
{
    if (i >= keys.Count - 1) break;
    
    Key nextKey = keys[i + 1];

    // do something with nextKey...
} 

或者我们可以将原始循环索引调整为仅上升到倒数第二个有效索引值,并且我们不必在循环内进行任何额外的检查。这仅在您根本不需要处理最后一项时才有意义:

for (int i = 0; i < keys.Count - 1; i++)
{
    Key nextKey = keys[i + 1];

    // do something with nextKey...
}

【讨论】:

  • 我认为if (i == keys.Count - 1) break; 已经足够了.. 无论如何都不会是&gt;
【解决方案2】:

您在上一次迭代中遇到错误,因为您正在访问 keys[i + 1]

我正要建议钥匙。 Count-1 但我看到你提到了它,因此,我建议做一个 if 而不是访问超出范围的索引。

if (i + 1 >= keys.Count)
{
    continue; // or break.. Depends on your logic
}

Key nextKey = keys[i + 1];
// do something with nextKey...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 2013-04-21
    • 2018-08-24
    • 1970-01-01
    • 2021-02-27
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多