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



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

我的问题是它什么时候会检查超出范围的索引。有什么方法可以检查它们吗(当然,我不想让很多IF检查x-1或y-1是否在范围内)。我还没有经常使用try/catch,我也不确定它是如何工作的,但我可以忽略它的越界异常吗?或者这个问题有更好的解决方案吗?

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

或者,如果限制仅针对语法而非条件本身,则可以使用? :而不是if条件。

我建议使用扩展方法来隐藏其中的逻辑(无论是使用if还是使用Math.MaxMath.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);

您可以计算两个维度的安全下限和上限,然后在矩阵上迭代:

// 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]

我认为您必须检查每个索引是否位于数组边缘。带有必要的"如果"

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

像这样:

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

相关内容

  • 没有找到相关文章

最新更新