我有以下数组:
int[,] myArray1 = new int[2, 3] { { 1, 2, 3 }, { 4, 6, 8 } };
int[,] myArray2 = new int[2, 3] { { 6, 4, 3 }, { 8, 2, 8 } };
我想知道该怎么做:
总和的结果将是:
int[,] myArray3 = new int[2, 3] { { 7, 6, 0 }, { -4, 4, 0 } };
减法结果如下:
int[,] myArray3 = new int[2, 3] { { 5, 2, 6 }, { 12, 8, 16 } };
乘法结果为:
int[,] myArray3 = new int[2, 3] { { 6, 8, 9 }, { 32, 12, 64 } };
这可以类似于使用for循环打印数组吗?我试过寻找例子,但没有发现我可以用于我的具体问题。
答案 0 :(得分:7)
我通常尝试使用LINQ,但我能找到的只使用循环。
int[,] myArray3 = Compute(myArray1, myArray2, (x,y) => x+y);
int[,] myArray4 = Compute(myArray1, myArray2, (x,y) => x-y);
int[,] myArray5 = Compute(myArray1, myArray2, (x,y) => x*y);
int[,] Compute(int[,] a, int[,] b, Func<int,int,int> operation)
{
int cols = a.GetLength(0);
int rows = a.GetLength(1);
int[,] result = new int[cols,rows];
for(int col=0; col<cols ; col++)
{
for(int row=0; row<rows ; row++)
{
result[col,row] = operation(a[col,row], b[col,row]);
}
}
return result;
}
Func<int,int,int>
是一个delegate
,它将两个int
作为参数,并以int
作为返回值。 delegate
就像方法的“句柄”或“指针”。
然后你可以简单地调用operation()
来调用作为参数传递的方法。
这里我使用以下lambda表达式:
(x,y) => x+y
计算添加(x,y) => x-y
计算减法(x,y) => x*y
计算乘法次数所有这些都以operation
参数传递,因此可以从Compute()
内部调用它们。编译器会自动从这些lambda创建Func<int,int,int>
。
这样您就可以使用相同的Compute()
方法来应用各种操作。
答案 1 :(得分:1)
索引[i,j]
的结果是同一索引处两个源数组中元素的求和,乘法或减法。因此,您只需循环遍历这些索引并将每个单元格的结果值分配给结果数组即可。
int[,] myArray1 = new int[2, 3] { { 1, 2, 3 }, { 4, 6, 8 } };
int[,] myArray2 = new int[2, 3] { { 6, 4, 3 }, { 8, 2, 8 } };
int[,] result = new int[2, 3];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
result[i, j] = myArray1[i, j] + myArray2[i, j];
// ^
// change that for a different operation
}
}
如果您需要所有结果,您也可以一次计算所有结果,从而避免多次迭代数组:
int[,] resultAdd = new int[2, 3];
int[,] resultMultiply = new int[2, 3];
int[,] resultSubtract = new int[2, 3];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
resultAdd[i, j] = myArray1[i, j] + myArray2[i, j];
resultMultiply[i, j] = myArray1[i, j] * myArray2[i, j];
resultSubtract[i, j] = myArray1[i, j] - myArray2[i, j];
}
}