【问题标题】:difference between double[*,*] to double[][] in c#c# 中 double[*,*] 到 double[][] 的区别
【发布时间】:2013-07-22 19:13:25
【问题描述】:

我用过

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

public void verifymarks(double[][] marks)

我得到的错误是无法从 double[,] 转换为 double[][] 我试图在互联网上搜索,但找不到任何解决方案。我刚开始使用c#。请帮忙。提前谢谢

【问题讨论】:

  • 第一个是 JaggedArray,第二个是 2D-Array。现在按这些名称搜索。
  • 如果它们都是数组且数据类型相同,为什么我不能使用 jaggedarray[5][1]=multidimarray[5,1]

标签: c#


【解决方案1】:

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

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

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

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

1231243245345345345345
23423423423423
2342342343r234234234234234234
23423

而多维数组必须是一个完美的表,像这样:

34534534534534
34534534534533
34534534534534
34534534534545

绕过它的一种方法是使用可为空的ints。

现在,解决您的问题:

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

【讨论】:

  • 你能扩展“获得特殊编译器处理”部分吗?听起来很有趣。
  • @Gray 我会尝试,但最好的人是 Eric Lippert。
【解决方案2】:

double[][] 称为Jagged array。它是一个数组数组(与创建列表列表的方式相同)。使用这种结构,您可以为每个子数组指定不同的大小。

例如:

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

另一种写法double[,]是一个二维数组(一般为Multidimensional array)。您可以将其视为表格。

多维数组的一个非常方便的特性是初始化:

string[,] test = new string[3, 2] { { "one", "two" }, 
                                    { "three", "four" },
                                    { "five", "six" } };

【讨论】:

  • 如果它们都是数组,为什么我不能使用 jaggedarray[5][1]=multidimarray[5,1]
  • 如果 jaggedarraymultidimarray 包含相同的数据类型,它应该可以工作。
  • 我试过 double[][] jaggedarray=new double[27][]; for (int j = 0; j 但它不起作用它们都是双重的
  • 因为jaggedarray[j] 没有初始化。您必须为每个j 执行jaggedarray[j] = new double[2]。在访问其元素之前。
【解决方案3】:

这是来自 LINQPad 的 Dump() 函数的视觉效果。

第一个是double[,],它创建了一个矩阵。第二个是double[][],就是一个数组数组。

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多