1

У меня есть 2-мерный массив, и я хочу выполнить поиск определенного значения вокруг этого индекса (так что я хочу проверить массив [x-1, y], array [x, y-1] и т. д.).Проверка значений в массиве вокруг определенного индекса

У меня проблема, когда он проверит индекс, который выходит за пределы допустимого диапазона. Есть ли возможность проверить их (я не хочу, чтобы многие проверяли IF, если x-1 или y-1 в курсе). Я еще не использовал try/catch, и я не уверен, как это работает, но могу ли я игнорировать исключение из области исключения? Или есть лучшее решение этой проблемы?

+3

Вам нужно либо проверить длину перед доступом, либо вам придется поймать исключение. У вас нет другого варианта. –

+3

Могу ли я спросить, почему вы не хотите использовать 'if' для проверки диапазона? –

+0

Единственная причина в том, что тогда было бы много, если бы было, и я хочу избежать этого, если это возможно. – Hevesi

ответ

0

Если у вас не может быть if, вы можете предварительно вычислить списки индексов для каждой ячейки и перебрать их. То есть имеют отдельный массив тех же размеров, который содержит списки пар индексов для итерации. Внутренние элементы будут иметь по 8 пар каждый, угловые и пограничные элементы будут иметь меньше (соответственно 3 и 5).

В качестве альтернативы вы можете использовать ? : вместо if Условие в случае, если ограничение распространяется только на синтаксис, а не на само условие.

-1

Я думаю, вам нужно будет проверить каждый индекс, если он находится вокруг краев массива. с необходимым «если в»

, если вы хотите использовать попытаться поймать его будет работать, но вы должны окружить каждый доступ к массиву с собственными попытаться поймать (если все будет в том же попытках, один раз исключение поймано следующие команды будут пропущены)

как это:

try 
{ 
    array[x-1,y] 
} 
catch (ArgumentOutOfRangeException ex)    
{     

} 

try 
{ 
    array[x,y-1] 
} 
catch (ArgumentOutOfRangeException ex)    
{     

} 

etc.. 
0

Я предлагаю использовать метод расширения для сокрытия логики в ней (погоде с if-й или с Math.Max и Math.Min):

public static partial class Array2DExtensions { 
    public static IEnumerable<T> Vicinity<T>(this T[,] data, int line, int col) { 
     if (null == data) 
     throw new ArgumentNullException("data"); 
     //TODO: you may want to add range check here 

     for (int i = Math.Max(data.GetLowerBound(0), line - 1); 
       i <= Math.Min(data.GetUpperBound(0), line + 1); 
       ++i) 
     for (int j = Math.Max(data.GetLowerBound(1), col - 1); 
       j <= Math.Min(data.GetUpperBound(1), col + 1); 
       ++j) 
      yield return data[i, j]; 
    } 
    } 

И так что вы можете поставить что-то вроде этого:

int[,] sample = ... 
    ... 
    // Are there any value less than 100 in vicinity of 5, 7 item? 
    bool found = sample 
    .Vicinity(5, 7) 
    .Any(item => item < 100); 
0

Вы можете рассчитать безопасные нижний и верхний пределы для обоих размеров, а затем перебрать матрицы:

// Calculate x range to check 
var xl = Math.Max(x-1, 0); 
var xu = Math.Min(x+1, array.GetUpperBound(1)); 

// Calculate y range to check 
var yl = Math.Max(y-1, 0); 
var yu = Math.Min(y+1, array.GetUpperBound(0)); 

// Iterate using ranges 
for (var j=yl; j <= yu; j++) 
    for (var i=xl; i <= xu; i++) 
    // Do the checking 
    // array[j, i]