错误未处理的异常:System.IndexOutOfRangeException?

时间:2013-03-16 16:15:56

标签: c# arrays if-statement for-loop indexing

错误索引超出了数组的范围。 程序是从数组中删除重复项 我理解第32行的错误,其中在for循环结束时创建了一个额外的元素,但我无法找到一种方法来显示没有重复项的整个数组。 prog想要做的是在数组中输入一个5号,然后对它们进行排序,如果它们是重复的,则将其删除。 我希望我说清楚了!

     using System;

     class duplicate 
     {
        static void Main() 
        {
            const int Array_Size = 5;
            int [] number = new int [Array_Size];
            int i;

    for ( i = 0; i < Array_Size; i++) 
    {
        number[i] = Int32.Parse(Console.ReadLine());
        if (number[i] < 9 || number[i] > 101)
        {
            Console.WriteLine("Enter Number between 10 - 100");
            number[i] = Int32.Parse(Console.ReadLine());
        }
    }

    Array.Sort(number);

    Console.WriteLine("Sorted Array : ");

    for (i = 0; i < Array_Size; i++)
    {
        Console.WriteLine("Element is " + number[i]);
    }

    Console.WriteLine("Duplicate Removed : ");

    for (i = 0; i < Array_Size; i++)
    { 
        if (number[i] != number[i+1])
            Console.WriteLine("Element is " + number[i]);
    }

    Console.ReadLine();
}

}

4 个答案:

答案 0 :(得分:2)

此行正在发生例外情况:

if (number[i] != number[i+1])

在循环的最后一次迭代中,该行将解析为:

if(number[4] != number[5])

由于您的数组中只有5个项目且基于0,number[5]会导致IndexOutOfRange例外。

如果你试图将每个项目与之后的项目进行比较,那么就不要检查最后的迭代:

if(i != Array_Size && number[i] != number[i+1])

或者只循环到Array_Size - 1

for (i = 0; i < Array_Size - 1; i++)

答案 1 :(得分:1)

您可以使用LINQ从数组中获取不同的值:

var distinct = number.Distinct().ToArray();

您需要在文件顶部using System.Linq;才能使其正常运行。

并说清楚:你的例外来自:

for (i = 0; i < Array_Size; i++)
{ 
    if (number[i] != number[i+1])
        Console.WriteLine("Element is " + number[i]);
}

i == Array_Size -1(最后一次通过)number[i+1]不存在时。

答案 2 :(得分:0)

if声明根本不安全

for (i = 0; i < Array_Size; i++) {
   if (number[i] != number[i+1])
     ...

循环中i的最终值为Array_Size - 1,因此i + 1不是数组的合法索引。要解决此问题,只需更改for循环上的约束,使i + 1始终是合法索引

for (i = 0; i < Array_Size - 1; i++)

答案 3 :(得分:0)

当然Linq是今天要走的路,但你仍然可以使用老式的循环

int prev = number[0];
Console.WriteLine("Element is " + prev);
for (int i = 1; i < Array_Size; i++)
{ 
    int cur = number[i];
    if (cur != prev)
    {
        Console.WriteLine("Element is " + cur);
        prev = cur;
    }
}