C# 检查围绕特定索引的数组中的值

C# 检查围绕特定索引的数组中的值,c#,arrays,multidimensional-array,indexoutofrangeexception,C#,Arrays,Multidimensional Array,Indexoutofrangeexception,我有一个二维数组,我要做的是搜索该索引周围的特定值(所以我要检查数组[x-1,y],数组[x,y-1]等等) 我的问题是它什么时候会检查超出范围的索引。是否有办法检查它们(当然,我不想让很多IF检查x-1或y-1是否在范围内)。我还没有经常使用try/catch,我也不知道它是如何工作的,但是我可以忽略超出范围的异常吗?或者这个问题有更好的解决方案吗?如果您不能使用如果您可以预先计算每个单元格的索引列表并对其进行迭代。即,具有相同维度的单独数组,其中包含用于迭代的索引对列表。内部元素各有8对,角

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


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

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


或者,您可以使用
?:而不是
如果
条件在case中的限制仅在语法上,而不是条件本身。

我认为您必须检查每个索引是否位于数组边缘附近。 用必要的“如果”

如果你想用try-and-catch,它会有用的, 但您必须在每个阵列访问中使用自己的Try-And-Catch (如果所有命令都在同一个try中,则一旦捕获到异常,将跳过以下命令)

像这样:

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

}

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

}

etc..
  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);
我建议使用扩展方法隐藏其中的逻辑(weather with
if
,或with
Math.Max
Math.Min
):

public静态部分类array2dex{
公共静态IEnumerable邻近区域(此T[,]数据,整数行,整数列){
if(null==数据)
抛出新的异常(“数据”);
//TODO:您可能需要在此处添加范围检查
for(int i=Math.Max(data.GetLowerBound(0),第1行);

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

// 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]
//计算要检查的x范围
var xl=数学最大值(x-1,0);
var xu=Math.Min(x+1,array.GetUpperBound(1));
//计算要检查的y范围
var yl=数学最大值(y-1,0);
var yu=Math.Min(y+1,array.GetUpperBound(0));
//使用范围进行迭代

对于(var j=yl;j您需要在访问之前检查长度,否则必须捕获异常。您实际上没有其他选择。我可以问一下为什么您不想使用
if
检查范围吗?唯一的原因是,这样会有很多if,如果可能的话,我希望避免。我目前只能看到一个
if,检查数组的上限(下限通常为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]