2013-03-16 5 views
0

Индекс ошибок находился за пределами массива. Программа должна удалить дубликаты из массива Я понимаю ошибку, которая является той строкой 32, где в конце цикла for создается дополнительный элемент, но я не могу определить способ отображения всего массива без дубликатов. Предполагается, что prog вводит в массив 5 чисел, а затем сортирует их, и если их дубликаты удаляют его. Надеюсь, я дал понять!Ошибка Необработанное исключение: System.IndexOutOfRangeException?

 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(); 
} 

}

ответ

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; 
    } 
} 
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

Исключение происходит в этой строке:

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

На последней итерации вашего цикла, что линия будет решать:

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

Поскольку ваш массив имеет только 5 пунктов в нем и 0-based, number[5] приводит к вашему исключению IndexOutOfRange.

Если вы пытаетесь сравнить каждый элемент на один после него, просто не проверяют на последней итерации:

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

Или только петля до Array_Size - 1:

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

Как я могу его исправить? – user1905501

+0

@ user1905501: see my edit – goric

0

Это заявление if просто небезопасно

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

Конечное значение o f i в цикле будет Array_Size - 1, следовательно i + 1 не является юридическим индексом в массиве. Чтобы исправить это просто изменить ограничение на петле for таким образом, что i + 1 всегда юридический индекс

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

Если я использую for (i = 0; i user1905501

Смежные вопросы