2013-10-04 3 views
1

В следующем коде я пытаюсь распечатать позиции чисел под 0. Я могу получить сами цифры, напечатанные отлично, но не могу понять, как получить позиции для печати.Как найти положение элементов в 2D-массиве?

Он компилируется отлично, но когда я его запускаю, он распечатывает первое число, а затем падает.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Tutorial_3 
{ 
    class Q8FourByFiveArray 
    { 
     static void Main(string[] args) 
     { 
      int[,] numbers = new int[4, 5] { {1, -2, 6, -9, 8}, {-3, 4, -3, 6, 7}, {5, 6, -9, 0, -2}, {4, 5, -1, -7, 1}}; 

      //search the array for numbers less than 0. Then print their positions 
      for (int r = 0; r < 4; r++) 
      { 
       for (int c = 0; c < 5; c++) 
       { 

        if (numbers[r, c] < 0) 
        { 
         Console.WriteLine(numbers.GetValue(r, c)); 
         Console.WriteLine("Row: " + Array.IndexOf(numbers, r, c)); 
         Console.WriteLine("Column: " + Array.IndexOf(numbers, c)); 

        } 
       } 
       Console.WriteLine(" "); 
      } 
     } 
    } 
} 
+0

Какое исключение вызывается, что приводит к его сбою? –

+0

'r' и' c' - уже индексы элементов. Просто распечатайте его, а не используя 'Array.IndexOf' – pkuderov

ответ

2

Вам не нужно Array.IndexOf, у вас уже есть строки и столбец через вложенный цикл. Используй их.

int[,] numbers = new int[4, 5] { { 1, -2, 6, -9, 8 }, { -3, 4, -3, 6, 7 }, { 5, 6, -9, 0, -2 }, { 4, 5, -1, -7, 1 } }; 
//search the array for numbers less than 0. Then print their positions 
for (int r = 0; r < 4; r++) 
{ 
    for (int c = 0; c < 5; c++) 
    { 
     if (numbers[r, c] < 0) 
     { 
      Console.Write(numbers.GetValue(r, c)); // better to use numbers[r,c] 
      Console.Write(" Row: " + r); 
      Console.WriteLine(" Column: " +c); 

     } 
    } 
    Console.WriteLine(" "); 
} 

Или просто одну строку для вывода:

Console.WriteLine("Number: {0}, Row: {1}, Column: {2}", numbers.GetValue(r, c), r, c); 
+0

Я не понимаю, что стандартные индексы устарели? –

+0

@HamletHakobyan, no 'Array.IndexOf' не устарел. Просто в этом коде нет необходимости, и он неправильно используется в коде OP. – Habib

+0

@ HamletHakobyan, что вы имеете в виду? 'IndexOf' возвращает индекс заданного значения в вашем массиве. Код OP уже знает, что такое индексы, потому что он выполняет итерацию по массиву и проверяет условие меньше нуля. 'IndexOf' можно было бы использовать с запросом LINQ, чтобы обеспечить отличное решение, но я не думаю, что это сработает, потому что (насколько мне известно) вы не можете передать ему условие для значения, а только фактическое значение. – evanmcdonnal

0

Так что может быть немного запутался о том, что проблема, но от того, что я понимаю, что вы просто хотите, чтобы напечатать значения r и c. Вместо этого вы делаете это IndexOf, который фактически должен принять значение, которое вы ищете для индекса возврата, так что использование обычно неверно.

в основном изменить это;

   if (numbers[r, c] < 0) 
       { 
        Console.WriteLine(numbers.GetValue(r, c)); 
        Console.WriteLine("Row: " + Array.IndexOf(numbers, r, c)); 
        Console.WriteLine("Column: " + Array.IndexOf(numbers, c)); 

       } 

к этому;

   if (numbers[r, c] < 0) 
       { 
        Console.WriteLine(numbers.GetValue(r, c)); 
        Console.WriteLine("Row: " + r.ToString()); 
        Console.WriteLine("Column: " + c.ToString()); 

       } 
1

Изменить это:

Console.WriteLine("Row: " + Array.IndexOf(numbers, r, c)); 
Console.WriteLine("Column: " + Array.IndexOf(numbers, c)); 

Для этого:

Console.WriteLine("Row: " + r.ToString()); 
Console.WriteLine("Column: " + c.ToString()); 
+1

вызов' ToString' можно удалить, так как он будет неявно вызываться строкой concate – Habib

0

Array.IndexOf может использоваться один двумерными массивами. В этом коде нет необходимости использовать его. просто используйте r и c как положение элемента.

0

Array.IndexOf() на самом деле не делает то, что вы думаете. Он сканирует первый параметр для первого значения, который соответствует второму параметру, начиная с третьего параметра.

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