假设你有一个像:
这样的数组double[,] rectArray = new double[10,3];
现在你想把第四行作为一个包含3个元素的double []数组而不做:
double[] fourthRow = new double[]{rectArray[3,0],
rectArray[3,1],
rectArray[3,2]};
有可能吗?甚至使用Marshal.Something方法?
谢谢!
答案 0 :(得分:18)
您可以使用Buffer.BlockCopy
方法:
const int d1 = 10;
const int d2 = 3;
const int doubleSize = 8;
double[,] rectArray = new double[d1, d2];
double[] target = new double[d2];
int rowToGet = 3;
Buffer.BlockCopy(rectArray, doubleSize * d2 * rowToGet, target, 0, doubleSize * d2);
答案 1 :(得分:14)
LINQ救援:
var s = rectArray.Cast<double>().Skip(9).Take(3).ToArray();
说明:投射多维数组会将其展平为一维数组。之后,我们需要做的就是跳到我们想要的元素(二维数组中的第四个元素解析为Skip(9)...)并从中获取3个元素。)
答案 2 :(得分:8)
为什么不制作通用的扩展方法?
public static T[] GetRow<T>(this T[,] input2DArray, int row) where T : IComparable
{
var width = input2DArray.GetLength(0);
var height = input2DArray.GetLength(1);
if (row >= height)
throw new IndexOutOfRangeException("Row Index Out of Range");
// Ensures the row requested is within the range of the 2-d array
var returnRow = new T[width];
for(var i = 0; i < width; i++)
returnRow[i] = input2DArray[i, row];
return returnRow;
}
像这样你只需编码:
array2D = new double[,];
// ... fill array here
var row = array2D.GetRow(4) // Implies getting 5th row of the 2-D Array
如果您在获取行之后尝试链接方法,并且对LINQ命令也有帮助,那么这很有用。
答案 3 :(得分:3)
您可能想要使用锯齿状数组。这不是一个10乘3的数组,而是一个数组数组。
类似的东西:
double[][] rectArray;
....
double [] rowArray = rectArray[3];
有很多地方可以了解有关锯齿状阵列的更多信息。例如Dynamically created jagged rectangular array
答案 4 :(得分:2)
如果必须使用矩形数组并且只想简化语法,可以使用方法来获取行:
double[] fourthRow = GetRow(rectArray, 3);
public static T[] GetRow<T>(T[,] matrix, int row)
{
var columns = matrix.GetLength(1);
var array = new T[columns];
for (int i = 0; i < columns; ++i)
array[i] = matrix[row, i];
return array;
}
答案 5 :(得分:0)
虽然这是一个老话题,但对Joseph Sturtevants答案的补充可能是有用的。如果矩阵的第一列不是零,而是另一个整数,他的函数会崩溃。 这是例如在从Excel中检索数据时总是如此,例如
object[,] objects = null;
Excel.Range range = worksheet.get_Range("A1", "C5");
objects = range.Cells.Value; //columns start at 1, not at 0
可以像这样修改GetRow函数:
public static T[] GetRow<T>(T[,] matrix, int row, int firstColumn)
{
var columns = matrix.GetLength(1);
var array = new T[columns];
for (int i = firstColumn; i < firstColumn + columns; ++i)
array[i-firstColumn] = matrix[row, i];
return array;
}