【发布时间】:2016-10-12 02:57:30
【问题描述】:
我觉得标题很清楚,所以我就在这里写一些个人意见。
考虑一个数字矩阵,C# 代码中的等效表示分别为double[,] 和double[][]。使用多维数组(本例为二维)时,可以很容易看出,既不需要检查double[]是否有空引用,也不需要检查行的大小是否相同,这样可以更好地对核心问题的理解。从我的角度来看,它还更准确地描述了矩阵,因为在大多数情况下,矩阵应该被视为单个实体而不是数组列表。
但是使用多维数组可能会导致更多的代码行。如果想对其应用数学运算,例如转置,他将不得不使用嵌套循环,例如
var row = mat.GetLength(0);
var col = mat.GetLength(1);
var newmat = new double[col, row];
for (var i = 0; i < row; i++)
{
for (var j = 0; j < col; j++)
{
newmat[j, i] = mat[i, j];
}
}
有了锯齿数组,他可以简单地写
var newmat = Enumerable.Range(0, mat[0].Length - 1).
Select(i => mat.Select(r => r[i]).ToArray()).ToArray();
我不确定哪个更好。通常我只创建自己的子程序,除非.Net 没有提供解决方案,所以我更喜欢后者。但是多维数组确实有我非常喜欢的优点。谁能教我如何在它们之间进行选择?
【问题讨论】:
-
锯齿状数组在代码中有点笨拙,但在运行时效率更高。多维数组的数组边界检查很难消除。当你也消除了笨拙时,那就不费吹灰之力了。
-
是的,我读到了那个答案,谢谢 Abudl。但在这种情况下,我想我会更关心代码的可读性而不是性能问题。
-
好吧,当我说可读性时,我实际上是指在“数学上”更类似于问题。
标签: c# matrix multidimensional-array jagged-arrays