C#:double[][] 和 double[,] [重复]
Posted
技术标签:
【中文标题】C#:double[][] 和 double[,] [重复]【英文标题】:C#: double[][] and double[,] [duplicate] 【发布时间】:2013-07-23 22:58:17 【问题描述】:我在 C# 中混淆了 double[][] 和 double[,]。 我的队友给我这样的功能:
public double[][] Do_Something(double[][] A)
.......
我想使用这个功能:
double[,] data = survey.GetSurveyData(); //Get data
double[,] inrma = Do_Something(data);
导致错误:参数无效。
我不想编辑队友的代码。
有没有办法将 double[][]
转换为 double [,]
?
谢谢!
【问题讨论】:
double[][]
是一个锯齿状数组。 double[,]
是一个多维数组。它们绝对不是同一类型,它们的用途也有很大不同。为正确的任务使用正确的类型。
Why we have both jagged array and multidimentional array? 和 What is differences between Multidimensional array and Array of Arrays in C#? 的可能重复项
你或你的队友确定他们之间有什么区别吗?
【参考方案1】:
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;
【讨论】:
【参考方案2】:double[][]
和double[,]
有不同的含义。
double[][]
是锯齿状的,因此某些元素的长度可能与其他元素不同。
double[,]
是“矩形”,因此所有元素的长度相同。
您可以编写一个方法来“转换”两者,但您将如何纠正这些差异? IE。你将如何决定从长元素中“修剪”或扩展短元素以使其成为矩形?
【讨论】:
【参考方案3】: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;
【讨论】:
这只适用于非锯齿状的锯齿数组,要处理所有输入,您可以使用width = array.Max(a => a.Length)
,并用default(T)
填充空槽。如果您确实希望在此处进行检查,则应将其移出一个级别,因此每行仅检查一次,而不是每个单元格。【参考方案4】:
它们是两种不同类型的数组。
double[][]
是一个交错数组,是数组的数组;这些数组中的每一个都可以有不同的长度,这会导致问题。
double[,]
只是一个多维数组。每行的列数相同,每列的行数也相同。
这种大小差异会导致问题,因为对于不同的行,锯齿状数组实际上可能是不同的维度。如果您知道锯齿状数组的确切尺寸,您可以编写一个方法在两者之间进行转换,但在这种情况下,我建议重写原始方法以接受并返回一个多维数组 (double[,]
)。
【讨论】:
以上是关于C#:double[][] 和 double[,] [重复]的主要内容,如果未能解决你的问题,请参考以下文章
请教c#中double类型转化为long类型的方法, 以及对double四舍五入的方法