为什么这个int数组抛出一个IndexOutOfRangeException?

时间:2011-10-20 17:33:58

标签: c# arrays visual-studio-2010

我觉得这是一个白痴问这个,但我不能为我的生活弄清楚为什么会发生这种IndexOutOfRangeException。 (我的意思是,我知道为什么它正在发生,我只是不知道我的代码无效)检查下面的代码以了解错误的位置:

public int[, ,] FindTablePairings(System.Text.RegularExpressions.MatchCollection mcBegin, System.Text.RegularExpressions.MatchCollection mcEnd)
    {
        int[,,] intTablePairs = new int[mcBegin.Count, 1, 1];
        int[] intBegin = new int[mcBegin.Count];
        int[] intEnd = new int[mcBegin.Count];

        for (int q = 0; q < mcBegin.Count; q++)
        {
            intBegin[q] = mcBegin[q].Index;
        }
        for (int q = 0; q < mcEnd.Count; q++)
        {
            intEnd[q] = mcEnd[q].Index;
        }

        int intBeginCount = mcBegin.Count;
        int intEndCount = mcEnd.Count;
        int i = 0;
        int j = 0;
        int k = 0;

        while (i < intBeginCount)
        {
            j = i;
            while (j < intEndCount)
            {
                if (intBegin[i + 1] < intEnd[j])
                {
                    j++;
                }
                else
                {
                    intTablePairs[i, 0, 0] = intBegin[i];
                    intTablePairs[i, 1, 0] = intEnd[j];
                    intEnd[j] = -1;                         //EXCEPTION OCCURS HERE
                    break;
                }
            }
            if (j == intEndCount)
            {
                intTablePairs[i, 0, 0] = intBegin[i];
                intTablePairs[i, 1, 0] = intEnd[j - 1];
                intEndCount--;
            }

            while (k < intEndCount)
            {
                if (intEnd[k] == -1)
                {
                    k++;
                }
                else
                {
                    intTablePairs[i,0,0] = intBegin[i];
                    intTablePairs[i,1,0] = intEnd[k];
                    intEnd[k] = -1;
                    k=0;
                    break;
                }
            }
        }

        return intTablePairs;
    }

代码只是查看开始标记和结束标记出现的字符索引。没有什么超级复杂...但最糟糕的是,异常是在intEnd[j] = -1;抛出,而在调试器中,在执行该语句之前,所有数组和MatchCollections都已正确初始化和填充,包括{{1} }!我已经调试以确保阵列存在并且已经初始化,并且我还清理了解决方案并重建了它。

有人对这里发生了什么有任何建议吗?

3 个答案:

答案 0 :(得分:5)

我认为错误实际上是在这一行

intTablePairs[i, 1, 0] = intEnd[j];

此处的问题是,您已将最后2个维度的长度定义为intTablePairs上的1。因此使用索引1是无效的,因为它等于长度。看起来你打算将界限定义为

int[,,] intTablePairs = new int[mcBegin.Count, 2, 2];

答案 1 :(得分:0)

也许看看这个:

 int[] intEnd = new int[mcBegin.Count];

在mcEnd上替换mcBegin并尝试一下。

答案 2 :(得分:0)

我认为intEnd应设置为mcEnd.Count容量。所以而不是:

int[] intEnd = new int[mcBegin.Count];

你应该:

int[] intEnd = new int[mcEnd.Count];

希望它有所帮助。