0

谁能告诉我为什么我会得到这个例外?好吧,我知道“为什么”我得到它是因为它说我尝试访问的列表中的元素不存在,但是单步执行代码我可以看到它确实存在?

在 Game1 中,我调用了辅助类的计算方法。然后当计算完成后,我将结果添加到 CalculationHelper 类中的 List<> 中。代码如下:

在 Game1 类中,我实例化了 CalculationHelper calcHelper 类,然后调用其中一个类方法。首先,在 Game1 中,我在 for() 循环中调用 calcHelper.ForceVanishingPointIntersections(...) 方法,如下所示。这工作得很好, calcHelper.ForceVanishingPointIntersections(...) 方法将值添加到 CalculationHelper 类中的 IntersectionPointList<> (参见下面的方法)。

for (int i = 0; i < LineList.Count; i++)
{
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);

    AddSprite(VanishingPointIntersectionList, calcHelper.GetIntersectionPointListElementAt(i), greenCirlce);
    i++;
}

要进行一些计算并向 CalculationHelper 类中的 IntersectionPointlist 添加一个值,我会这样做:

List<Vector2> IntersectionPointList = new List<Vector2>();
public void ForceVanishingPointIntersections(Line line1, Line line2)
{
    Vector2 intersectionPoint;
    // Do some calculations

    IntersectionPointList.Add(intersectionPoint);
}

最后在 Game1 类中,for() 循环中的第二个方法我调用 AddSprite 来创建一个 Sprite。我想将存储在 CalculationHelper 类 IntersectionPointList 中的值作为 Sprite 的坐标传递。为此,我调用 calcHelper.GetIntersectionPointListElementAt(i) 调用 CalculationHelper 类中的一个方法,如下所示(应该从 IntersectionPointList<> 返回指定点 (i) 处的值) public Vector2 GetIntersectionPointListElementAt(int index) { Vector2 result = this.IntersectionPointList[index]; 返回结果;第一次执行 for() 循环时,它工作正常。我进行计算,值存储在列表中,我能够从列表中获取该值并将其传递给 AddSprite(..)。然而,第二次 for() 循环,

public Vector2 GetIntersectionPointListElementAt(int index)
{
    Vector2 result = this.IntersectionPointList[index];    // Exception thrown here
    return result;
}

说索引超出范围?但是单步执行代码,我的 IntersectionPointList 已更新,它显示该列表现在包含 2 个值。我正在尝试访问第二个值。

有谁知道为什么会这样?对于我的生活,我无法弄清楚我哪里出错了。

如果需要更多代码,我可以发布更多,请告诉我

4

3 回答 3

4

因为您使用LineList[]索引进行访问,所以i + 1您必须在 for 条件中将最后一个索引减一。(注意-1

for (int i = 0; i < LineList.Count - 1; i++) {
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
    AddSprite( ... );
}

这将调用ForceVanishingPointIntersections索引

(0, 1), (1, 2), (2, 3), ... (Count-2, Count-1)

注意 的索引范围LineList0 ... Count-1


如果需要非重叠索引,例如

(0, 1), (2, 3), (4, 5), ... (Count-2, Count-1)

然后将循环更改为

for (int i = 0; i < LineList.Count - 1; i += 2) {
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
    AddSprite(
        VanishingPointIntersectionList,
        calcHelper.GetIntersectionPointListElementAt(i / 2),
        greenCirlce);
}

编辑根据 Chris Gessler 的评论,第二种方法是正确的。

删除i++循环内部,这是非常罕见且令人困惑的。相反,将其替换为i += 2循环标头。

另请注意(再次根据 Chris Gessler 的说法)IntersectionPointList的项目数量是LineList. 因此调用GetIntersectionPointListElementAt. i / 2既然i{0, 2, 4, ... }i / 2就是{0, 1, 2, ...}


for 循环允许您在第一和第三部分中使用逗号分隔的语句列表。您可以使用它来维护两个索引

for (int i = 0, k = 0; i < LineList.Count - 1; i += 2, k++) {
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);
    AddSprite(
        VanishingPointIntersectionList,
        calcHelper.GetIntersectionPointListElementAt(k),
        greenCirlce);
}
于 2012-04-22T14:47:42.473 回答
1
for (int i = 0; i < LineList.Count; i++)
{
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);

    ...

    i++;
}

而不是这样做,你应该这样做:

for (int i = 0; i < LineList.Count; i += 2)
{
    calcHelper.ForceVanishingPointIntersections(LineList[i], LineList[i + 1]);

    ...
}

如果 LineList.Count 不是偶数,例如:3。它将从 0 开始,您使用 0 和 1。然后它跳转到 2,您使用 2 和 3。但是,哎呀!没有3个!只数3!0比2!

那是您将参数超出范围异常的时候。为避免这种情况,您可以检查 Count % 2 == 0,或者如果您不介意跳过额外的(如果有),您可以一直到 LineList.Count - 1。

于 2012-04-22T14:41:51.680 回答
1

看起来您正在为每个 Sprite 添加两条线。索引不会排列。当 LineList 有 10 个项目时,您将只有 5 个 IntersectionPointList 项目,因此传入索引 9 将失败。

您应该将 LineList 集合更改为,List<Tuple<string,string>>以便每个项目有两行与每个 Sprite 对齐。这将在 Lines 和 Sprites 之间创建一对一的关系。

我想你总是可以传入一个索引 (i / 2),它应该是每两行的正确 Sprite。

于 2012-04-22T14:46:12.347 回答