C#UWP索引超出for循环的范围

时间:2018-06-28 14:48:35

标签: c# list indexing uwp

我正在关注youtube上的教程,由于某种原因,即使具有完全相同的代码,我也会遇到异常:

"Index was out of range. Must be non-negative and less than the size of the collection."

我想做的是,每次单击屏幕时,i值应该增加,但不是。

代码:

变量:

public static float PointX, PointY, PhotonX, PhotonY;

public static List<float> PhotonXPOS = new List<float>();
public static List<float> PhotonYPOS = new List<float>();
public static List<float> Percent = new List<float>();

在构造函数中:

Rect Bounds = ApplicationView.GetForCurrentView().VisibleBounds;

 //Photon location.
 PhotonX = (float)Bounds.Width / 2; //Always at middle.
 PhotonY = (float)Bounds.Height; //Always at bottom.

在另一种方法中:

private void GameCanvas_Draw(Microsoft.Graphics.Canvas.UI.Xaml.CanvasControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasDrawEventArgs args)
    {
        ///Display Projectiles.
        for (int i = 0; i < PhotonXPOS.Count; i++)
        {
            //Start and end point of a projectile.
            PointX = (PhotonX + (PhotonXPOS[i] - PhotonX) * Percent[i]);
            PointY = (PhotonY + (PhotonYPOS[i] - PhotonY) * Percent[i]);

            //Drawing of the Photons.
            args.DrawingSession.DrawImage(Scaling.Image(Photon), PointX - (25 * ScaleWidth), PointY - (25 * ScaleHeight));

            //Speed.
            Percent[i] += (0.050f * ScaleHeight);

            //If Photon goes out of screen at the top.
            if (PointY < 0f)
            {
                PhotonXPOS.RemoveAt(i);
                PhotonYPOS.RemoveAt(i);
                Percent.RemoveAt(i);
            }
        }           
    }

在行上给出异常

PointY = (PhotonY + (PhotonYPOS[i] - PhotonY) * Percent[i]);

好像PhotonYPOS[i]并没有增加,而是停留在起始值0,然后i就增加了并且比List本身更高。

编辑:这是单击屏幕(并将项目添加到列表中)时调用的方法:

    public void GameCanvas_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
    {
        if(RoundEnded == true)
        {
            GameState = 0;
            Countdown = 6;
            RoundEnded = false;
        }
        else
        {
            //Goes to next level.
            if (GameState == 0)
            {
                //Go to next level.
                GameState += 1;
                //Start round timer.
                RoundTimer.Start();                  
            }
            else if(GameState > 0)
            {
                //Add Photons.
                PhotonXPOS.Add((float)e.GetPosition(GameCanvas).X);
                PhotonXPOS.Add((float)e.GetPosition(GameCanvas).Y);
                Percent.Add(0f);
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

您遍历PhotonXPOS.Count,但是有时您使用PhotonXPOS.RemoveAt(i);进行删除,这就是i遍历数组数量的原因。

一种解决方案是倒退for (int i = PhotonXPOS.Count; i > 0; i--)

答案 1 :(得分:0)

简单错字 如评论中所述:

更改此 //Add Photons. PhotonXPOS.Add((float)e.GetPosition(GameCanvas).X); PhotonXPOS.Add((float)e.GetPosition(GameCanvas).Y); Percent.Add(0f);

对此 //Add Photons. PhotonXPOS.Add((float)e.GetPosition(GameCanvas).X); PhotonYPOS.Add((float)e.GetPosition(GameCanvas).Y); Percent.Add(0f);

对于第二个问题:跳过项目,删除最后一个项目后应减少i

示例 之前列出 1 2 3 4 5 在这种情况下,我是2,指向元素3, 现在您删除了元素2,则在循环末尾将i增大到3,它指向元素5

之后列出 1 2 4 5 i = 3

在这种情况下,永远不会使用索引为2的元素4。

建议的更改:

if (PointY < 0f)
{
    PhotonXPOS.RemoveAt(i);
    PhotonYPOS.RemoveAt(i);
    Percent.RemoveAt(i);
    i--;// in the next loop handle index i again (i-1+1=i)
}