获取double [,]矩形数组的double []行数组

时间:2010-06-04 19:41:19

标签: c# .net arrays

假设你有一个像:

这样的数组
double[,] rectArray = new double[10,3];

现在你想把第四行作为一个包含3个元素的double []数组而不做:

double[] fourthRow = new double[]{rectArray[3,0],
                                  rectArray[3,1], 
                                  rectArray[3,2]};

有可能吗?甚至使用Marshal.Something方法?

谢谢!

6 个答案:

答案 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;
    }