迭代List <string> </string>时索引超出范围的异常

时间:2010-06-16 02:52:24

标签: c# .net list

我有一个文件夹中图像位置的列表。

我有五个图片框可以模拟一个封面流类型区域,供用户浏览给定文件夹的图像。

我知道错误被触发了,因为集合中的第一个图像设置为第一个图片框,然后如果我点击cycleLeft(),则会出现负数。

我如何解释这个?例如,如果列表中的第一个图像已设置为最左侧,而有人单击左侧翻转,则将第一个图像放在列表的最后位置。

任何指导?

    private void leftArrow_Click(object sender, EventArgs e)
    {
        cycleImagesLeft();
    }

    private void rightArrow_Click(object sender, EventArgs e)
    {
        cycleImagesRight();
    }

    public void cycleImagesLeft()
    {
        //imageThree is the center image, that's why I use it as a frame of reference.
        int currentImage = pictures.IndexOf(imageThree.ImageLocation);
        imageOne.ImageLocation = pictures[currentImage - 3];
        imageTwo.ImageLocation = pictures[currentImage - 2];
        imageThree.ImageLocation = pictures[currentImage - 1];
        imageFour.ImageLocation = pictures[currentImage];
        imageFive.ImageLocation = pictures[currentImage + 1];
    }

    public void cycleImagesRight()
    {
        int currentImage = pictures.IndexOf(imageThree.ImageLocation);
        imageOne.ImageLocation = pictures[currentImage - 1];
        imageTwo.ImageLocation = pictures[currentImage];
        imageThree.ImageLocation = pictures[currentImage + 1];
        imageFour.ImageLocation = pictures[currentImage + 2];
        imageFive.ImageLocation = pictures[currentImage + 3];
    }

3 个答案:

答案 0 :(得分:2)

好吧,一个选项是使用辅助方法来确保值始终在边界内:

string GetPictureAt(int index)
{
    // Copes with values which are two large or too small,
    // but only as far as -pictures.Length
    if (index < 0)
    {
        index += pictures.Length;
    }
    return pictures[index % pictures.Length];
}

然后:

public void CycleImagesLeft()
{
    int currentImage = pictures.IndexOf(imageThree.ImageLocation);
    imageOne.ImageLocation = GetPictureAt(currentImage - 3);
    imageTwo.ImageLocation = GetPictureAt(currentImage - 2);
    // etc
}

CycleImagesRight()相同。我认为这样做你想要的,但我没有完全按照你的倒数第二句话。

请注意,您仍然需要考虑少于5张照片的可能性。

答案 1 :(得分:1)

始终可以使用Circular List。至少这种方式将所有索引管理内容抽象出来(进入可测试和可重用的类)。

答案 2 :(得分:0)

imageOne.ImageLocation = (currentImage - 3 < 0) ? null : pictures[currentImage - 3];
....
imageFour.ImageLocation = (currentImage + 2 >= pictures.Count) ? null : pictures[currentImage + 2];