代码之家  ›  专栏  ›  技术社区  ›  abenci

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

  •  13
  • abenci  · 技术社区  · 14 年前

    假设有一个数组,如:

    double[,] rectArray = new double[10,3];
    

    现在您希望第四行是3个元素的double[]数组,而不需要执行以下操作:

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

    有可能吗?甚至用元帅。什么办法?

    谢谢!

    6 回复  |  直到 14 年前
        1
  •  18
  •   max    14 年前

    你可以用 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);
    
        2
  •  14
  •   code4life    14 年前

    临危受命:

    var s = rectArray.Cast<double>().Skip(9).Take(3).ToArray();
    

    说明:投射多维数组会将其展平为一维数组。之后,我们需要做的就是跳转到我们想要的元素(二维数组中的第4个元素解析为跳转(9)…)并从中获取3个元素)。

        3
  •  8
  •   The Don    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命令也很有帮助。

        4
  •  3
  •   Community Romance    7 年前

    你可能想用锯齿阵。这不是一个10乘3的数组,而是一个数组数组。

    类似于:

            double[][] rectArray;
             ....
            double [] rowArray = rectArray[3];
    

    有很多地方可以学习更多关于锯齿形阵列的知识。例如 Dynamically created jagged rectangular array

        5
  •  2
  •   Joseph Sturtevant    14 年前

    如果必须使用矩形数组并且只想简化语法,则可以使用如下方法获取行:

    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;
    }
    
        6
  •  0
  •   josh    9 年前

    虽然这是一个老线索,一个补充约瑟夫斯图特万茨的答案可能是有用的。如果矩阵的第一列不是零,而是另一个整数,那么他的函数就会崩溃。 例如,在从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;
        }