我有一个二维数组,我想做的是搜索该索引周围的特定值(所以我想检查array[x-1,y],array[x,y-1]等等)。
我的问题是它什么时候会检查超出范围的索引。有什么方法可以检查它们吗(当然,我不想让很多IF检查x-1或y-1是否在范围内)。我还没有经常使用try/catch,我也不确定它是如何工作的,但我可以忽略它的越界异常吗?或者这个问题有更好的解决方案吗?
如果不能使用if
,则可以预先计算每个单元格的索引列表并对其进行迭代。即具有相同维度的单独数组,该数组包含用于迭代的索引对列表。内部元件将各有8对,角和边界元件将更少(相应地为3和5)。
或者,如果限制仅针对语法而非条件本身,则可以使用? :
而不是if
条件。
我建议使用扩展方法来隐藏其中的逻辑(无论是使用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);
您可以计算两个维度的安全下限和上限,然后在矩阵上迭代:
// 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..