我将尝试使用动态数学运算符处理二维数组。
以下是相关的方法:
public float[,] Calculate(int[,] a, int[,] b, Func<int,int,float> compute)
{
int columns = a.GetLength(0);
int rows = a.GetLength(1);
float[,] result = new float[columns,rows];
for(int i = 0; i < columns; i++)
{
for(int j = 0; j < rows; j++)
{
result[i,j] = compute(a[i,j], b[i,j]);
}
}
return result;
}
这个方法的调用方式如下:
int[,] a = new int[2,3] { {2, 6, 19}, {3, -4, 25}};
int[,] b = new int[2,3] { {12, -2, 11}, {1, -11, 0}};
//1
float[,] c = Calculate(a, b, (x,y) => (x+y));
//2
float[,] c = Calculate(a, b, (x,y) => (x-y));
//3
float[,] c = Calculate(a, b, (x,y) => (x*y));
//4
float[,] c = Calculate(a, b, (x,y) => (x/y));
现在,虽然版本1到3运行得非常顺畅,但是版本4迟早会抛出异常。 处理这种情况的一种方法是使用try catch块:
try
{
result[i,j] = compute(a[i,j], b[i,j]);
}
catch(DivideByZeroException ex)
{
result[i,j] = 0;
}
看起来我在使用try-catch进行流程控制,而我宁愿避免这种做法(此外,结果是错误的)。有没有一种方法可以检查函数调用中的除法运算符是否为/
,并检查第二个数组是否包含0,如果是,则返回null?
Calculate
抛出异常并在调用者(或调用者的调用者)中处理它。 - Henrikfloat?[,]
吗?如果是这样,我们可以将“compute”的定义更改为<int,int,float?>
。 如果是这样,我们是否可以允许“compute”决定其参数是否有意义,并决定何时返回“null”? - Damien_The_Unbeliever