我有一个二维数组,我想要做的是搜索该索引周围的特定值(所以我想检查数组[x-1,y],数组[x,y-1]等等) )。
我的问题是它何时会检查超出范围的索引。有没有办法检查它们(我不想要很多IF检查x-1或y-1是否在范围内)。我还没有尝试使用try / catch,而且我也不确定它是如何工作的,但是我可以忽略超出范围的Exception吗?或者这个问题有更好的解决方案吗?
答案 0 :(得分:0)
如果您没有if
,则可以预先计算每个单元格的索引列表并对其进行迭代。即具有相同维度的单独数组,其中包含用于迭代的索引对列表。内部元素每个将有8对,角和边框元素将少(相应地为3和5)。
或者,您可以使用? :
代替if
条件,以防限制仅限于语法,而不是条件本身。
答案 1 :(得分:0)
我建议使用扩展方法隐藏其中的逻辑(天气与Dictionary
或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];
}
}
答案 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..