检查特定索引周围的数组中的值

时间:2016-05-10 15:03:03

标签: c# arrays multidimensional-array indexoutofrangeexception

我有一个二维数组,我想要做的是搜索该索引周围的特定值(所以我想检查数组[x-1,y],数组[x,y-1]等等) )。

我的问题是它何时会检查超出范围的索引。有没有办法检查它们(我不想要很多IF检查x-1或y-1是否在范围内)。我还没有尝试使用try / catch,而且我也不确定它是如何工作的,但是我可以忽略超出范围的Exception吗?或者这个问题有更好的解决方案吗?

4 个答案:

答案 0 :(得分:0)

如果您没有if,则可以预先计算每个单元格的索引列表并对其进行迭代。即具有相同维度的单独数组,其中包含用于迭代的索引对列表。内部元素每个将有8对,角和边框元素将少(相应地为3和5)。

或者,您可以使用? :代替if条件,以防限制仅限于语法,而不是条件本身。

答案 1 :(得分:0)

我建议使用扩展方法隐藏其中的逻辑(天气与DictionaryifMath.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];
    }
  }  

答案 2 :(得分: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]

答案 3 :(得分:-1)

我认为你必须检查数据边缘周围的每个索引。 必要的“如果”

如果你想使用try和catch它会工作, 但你必须用它自己的Try And Catch包围每个数组访问 (如果所有内容都在同一个尝试中,一旦发现异常,将跳过以下命令)

像这样:

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

}

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

}

etc..