C#中double[*,*]和double[][]之间的区别

9

我使用了

double [,] marks=new double[26,5] 
int[] function = object.verify(marks) 

public void verifymarks(double[][] marks)

我得到的错误是无法将double[,]转换为double[][]. 我尝试在互联网上搜索,但找不到任何解决方案。 我刚开始使用C#。 请帮忙。 预先感谢。


第一个是"JaggedArray",第二个是"2D-Array"。现在按这些名称搜索。 - UsmanAzam
阅读https://dev59.com/qW445IYBdhLWcg3w5OEH - UsmanAzam
如果它们都是相同数据类型的数组,为什么我不能使用jaggedarray[5][1]=multidimarray[5,1]? - user1700961
3个回答

12

double[][] 是锯齿数组,它实际上是一个数组的数组。

double[,] 是多维数组,它得到特殊的编译器处理。

它们有不同的内存布局。 double[][] 是一个包含对其他数组的引用的数组,而double[,]则是按单一维度布局以便更容易使用。

另一个区别是它们可以保存哪些数据。 锯齿数组可以是这样的:

1231243245345345345345
23423423423423
2342342343r234234234234234234
23423

虽然多维数组必须是一个完整的表格,像这样:

34534534534534
34534534534533
34534534534534
34534534534545

解决这个问题的方法是使用可空的 int

现在,要解决您的问题:

将您的方法签名更改为 public void verifymarks(double[,] marks),并在方法中将使用 marks[x][y] 的任何内容更改为 marks[x,y]


1
你能详细说明一下“得到特殊编译器处理”的部分吗?听起来很有趣。 - Gray
@Gray 我会尝试,但更好的人选是Eric Lippert。 - It'sNotALie.

4

double[][]被称为 Jagged array。它是一个数组的数组(就像您可以创建一个列表的列表一样)。使用此结构,您可以为每个子数组指定不同的大小。

例如:

double[][] jaggedArray = new double[2][];
jaggedArray[0] = new double[5];
jaggedArray[1] = new double[151];

另一个写法double[,]是一个二维数组(通常为多维数组)。您可以将其视为表格。
多维数组非常方便的特性是初始化:
string[,] test = new string[3, 2] { { "one", "two" }, 
                                    { "three", "four" },
                                    { "five", "six" } };

如果它们都是数组,为什么我不能使用jaggedarray[5][1]=multidimarray[5,1]? - user1700961
如果jaggedarraymultidimarray包含相同的数据类型,它应该可以工作。 - Cédric Bignon
我尝试使用以下代码创建一个二维数组:double[][] jaggedarray=new double[27][]; for (int j = 0; j < 20; j++) { jaggedarray[j][0] = values[j, 0]; jaggedarray[j][1] = values[j, 3]; } 但是它没有起作用,两个都是double类型。 - user1700961
3
因为jaggedarray[j]没有被初始化。你需要为每个j执行jaggedarray[j] = new double[2],然后才能访问它的元素。 - Cédric Bignon

2

以下是来自LINQPad的Dump()函数的可视化结果。

enter image description here

第一张图展示了double[,],它创建了一个矩阵。第二张图展示了double[][],它只是一个数组的数组。


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