C#: double[][] and double[,]

5
我在C#中对double[][]和double[,]之间感到困惑。
我的队友给了我一个这样的函数:
public double[][] Do_Something(double[][] A)
{
     .......
}

我想使用这个函数:
double[,] data = survey.GetSurveyData(); //Get data
double[,] inrma = Do_Something(data);

它引发了一个错误:无效的参数。
我不想编辑我的队友的代码。
有没有办法将double[][]转换为double [,]

谢谢!


10
double[][] 是一种交错数组。double[,] 是一种多维数组。它们绝对不是同一种类型,而且它们的用途有很大的区别。使用正确的类型来完成正确的任务。 - J. Steen
你或者你的队友们确定他们之间的区别吗? - Soner Gönül
4个回答

9

double[][] 是一个由 double[] 组成的数组(即一个数组的数组), 但是 double[,] 则是一个单一的二维 double 数组。

例如:

double[] Array1 = new double[] {1,2,3};
double[] Array2 = new double[] {4,5,6};
double[][] ArrayOfArrays = new double[][] {Array1,Array2};
double[,] MultidimensionalArray = new  double[,] {{1,2}, {3,4}, {5,6}, {7,8}};   

8
double[][]double[,]有不同的含义。 double[][]是不规则的,因此某些元素的长度可能与其他元素不同。 double[,]是“矩形”的,因此所有元素的长度都相同。
你可以编写一个方法来在两者之间进行“转换”,但你将如何解决它们之间的差异?也就是说,你将如何决定从长元素中“修剪”或扩展短元素以使其成为矩形?

1
static T[,] Convert<T>(T[][] array)
{
    if (array == null)
        throw new ArgumentNullException("array");
    if (array.Length == 0)
        return new T[0, 0];
    T[,] retval = new T[array.Length, array[0].Length];
    for (int i = 0; i < array.Length; i++)
        for (int j = 0; j < array[i].Length; j++)
            if (array[i].Length != retval.GetLength(1))
                throw new Exception();
            else
                retval[i, j] = array[i][j];
    return retval;
}

1
这仅适用于非嵌套的交错数组,要处理所有输入,您可以使用 width = array.Max(a => a.Length),并使用 default(T) 填充空槽。如果您确实想在其中进行检查,那么应将其移出一级,以便每行仅检查一次,而不是每个单元格都检查一次。 - RoadieRich

1

它们是两种不同类型的数组。

double[][] 是一个交错数组,它是一个包含多个数组的数组;每个数组的长度可以不同,这会导致问题。

double[,] 只是一个多维数组。每一行都有相同数量的列,每一列都有相同数量的行。

这种大小差异会导致问题,因为交错数组在不同的行上实际上可能具有不同的维度。如果您知道交错数组的确切维度,则可以编写方法在两者之间进行转换,但在这种情况下,我建议重写原始方法以接受和返回多维数组 (double[,])。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接