C#循环字符串数组错误

时间:2011-08-10 14:54:11

标签: c#

好的我对此感到困惑,我有:一个int变量一个字符串数组和一个所有应该的语句。它非常标准的循环阵列结构。

public class Form1 : System.Windows.Forms.Form
{

    public int ticker = 0;
    public string[] pictureArray = new String[] {
            "image01.jpg",
            "image02.jpg",
            "image03.jpg",
            "image04.jpg",
            "image05.jpg",
            "image06.jpg",
            "image07.jpg",
            "image09.jpg",
            "image10.jpg",
            "image11.jpg",
            "image12.jpg",
            "image13.jpg",
            "image14.jpg",
            "image15.jpg",
            "image16.jpg",
            "image17.jpg",
            "image18.jpg",
            "image19.jpg",
            "image20.jpg",
            "image21.jpg",
            "image22.jpg"
        };
...
        if (this.ticker < 21)
        {
            this.ticker++;
        }
        else
        {
            this.ticker = 0;
        }

        MessageBox.Show(pictureArray[ticker]);

运行正常,直到自动收报机为> 21然后它崩溃并声明IndexOutOfRange,但如果我要说改变MessageBox只是打印自动收报机它没关系,我没有错误。现在我已经查看了类似的问题,但问题是我是一名PHP程序员,如果答案与我的情况有关,我不确定其中的一些。

任何帮助将不胜感激,我认为如果不是我道歉,我在这里有所有相关信息。但是一切都有效,直到它开始回收数组并再次运行数组。我只是感到困惑。

6 个答案:

答案 0 :(得分:12)

您缺少image08.jpg,这意味着您的数组中只有21个条目,而不是22.因此当ticker为21时,您将获得异常。

使这个更强大的一种方法是使用:

if (ticker < pictureArray.Length - 1)
{
    ticker++;
}
else
{
    ticker = 0;
}

或者使用条件:

ticker = ticker < pictureArray.Length - 1 ? ticker : 0;

或者理查德的“无条件增量,条件重置”。

或者可能更简单:

ticker = (ticker + 1) % pictureArray.Length;

不可否认,在这种情况下会导致您错过我怀疑的真正问题 - 您没有得到您期望拥有的所有图像。

答案 1 :(得分:2)

如果ticker = 20,则单击最多21个。

然后尝试在21位索引基于0的21元素数组。

你的if应该是ticker < 20

编辑 -

哈,看起来虽然这会解决你的索引问题,但Jon的回答是正确的。

这很有趣。

答案 2 :(得分:2)

更改它以执行此操作:

MessageBox.Show(pictureArray[ticker]);

ticker++;
if (ticker >= pictureArray.Length)
{
    ticker = 0;
}

这样,如果你改变pictureArray的大小,它也会适应。

答案 3 :(得分:1)

问题是你根本不读索引0。在第一个实例中,在读取第一个元素之前增加this.ticker。在每个数组位置显示字符串的值后,您应该递增。

最终,最终发生的事情是您将索引设置为21而不是20,因此IndexOutOfRangeException

答案 4 :(得分:0)

你实际上有21件物品你缺少image08.jpg !!所以你应该把条件改为&lt; 20。或者一般< PictureArray.Length - 1

答案 5 :(得分:0)

BrandonS,你的代码问题非常微小,但结果很糟糕。 您的代码流程:

  1. 首先,您要检查自动收报机的价值
  2. 如果它更小,则增加到1,否则使其为0
  3. 您打印数组
  4. 的值

    所以,     public string [] pictureArray = new String [] {“image01.jpg”,“image02.jpg”}; //数组2

    ticker = 0
    if (ticker < 2)
        ticker++;  // STEP 1
    else
        ticker = 0;
    MessageBox.Show(pictureArray[ticker]);  // STEP 2
    
    ticker    Image Shown
    0          image02.jpg
    1          image03.jpg   ?????
    

    检查后,您正在递增,然后进行透支,因此显示的值已经超过了自动收报机1。 计算出不同的方法: - 你可以将if子句(ticker&lt; 21)替换为(ticker&lt; pictureArray.Length -1)。 增加访问前一张图片后,使用pictureArray [ticker-1]。 或显示后增加。 编写了一个有效的小代码。结果也显示出来了。

        string[] pictureArray = new String[] {"image01.jpg","image02.jpg};
            int ticker = 0;
            do
            {
                if (ticker < pictureArray.Length - 1)
                    ticker++;
                else
                    ticker = 0;
                Console.WriteLine("Ticker = " + ticker + " Image = " + pictureArray[ticker]);
            } while (true);
    
       Results :
     Ticker = 1 Image = image02.jpg
    Ticker = 0 Image = image01.jpg
    Ticker = 1 Image = image02.jpg
    Ticker = 0 Image = image01.jpg
    

    以下显示的陈述将与上述结果相同:        if(ticker == 0)            Console.WriteLine(“Ticker =”+ ticker +“Image =”+ pictureArray [0]);         其他            Console.WriteLine(“Ticker =”+ ticker +“Image =”+ pictureArray [ticker]);

    如果您可以先显示然后递增或在递增之前将其值保存在其他var中,并使用该var来显示最佳结果,而不是上面的那些。

    int displayTicker = 0;
    if (ticker < 2) {
        displayTicker =ticker;
        ticker++;
    } else {
         displayTicker = ticker = 0;
    }
    MessageBox.Show (pictureArray[displayTicker]);
    

    我相信这个选项会是最好的选择。在这种情况下,最好有2个vars,而不是保留一个并对其进行检查。

    希望这会有所帮助。