Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取双[,]矩形数组的双[]行数组_C#_.net_Arrays - Fatal编程技术网

C# 获取双[,]矩形数组的双[]行数组

C# 获取双[,]矩形数组的双[]行数组,c#,.net,arrays,C#,.net,Arrays,假设您有一个如下所示的数组: double[,] rectArray = new double[10,3]; 现在,您希望第四行是由3个元素组成的双[]数组,而无需执行以下操作: double[] fourthRow = new double[]{rectArray[3,0], rectArray[3,1], rectArray[3,2]}; 有可能吗?甚

假设您有一个如下所示的数组:

double[,] rectArray = new double[10,3];
现在,您希望第四行是由3个元素组成的双[]数组,而无需执行以下操作:

double[] fourthRow = new double[]{rectArray[3,0],
                                  rectArray[3,1], 
                                  rectArray[3,2]};
有可能吗?甚至使用了一个元帅。什么方法


谢谢

您可能希望使用锯齿状数组。这不是一个10乘3的数组,而是一个数组数组

比如:

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

有很多地方可以学习更多关于锯齿阵列的知识。例如

您可以使用
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);

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

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;
}
double[]fourthRow=GetRow(rectary,3);
公共静态T[]GetRow(T[,]矩阵,int行)
{
var columns=matrix.GetLength(1);
var数组=新的T[列];
对于(int i=0;i
LINQ救援:

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

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

尽管这是一个旧线程,添加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;
    }
publicstatict[]GetRow(T[,]矩阵,int行,int第一列)
{
var columns=matrix.GetLength(1);
var数组=新的T[列];
for(int i=firstColumn;i
为什么不创建一个通用扩展方法

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

如果您在获取一行后尝试链接方法,这将非常有用,并且对LINQ命令也很有帮助。

对不起,我需要一个矩形数组。好的。。。但是你描述了一个你想做的任务,这个任务在锯齿数组中更有意义。(无论如何,它们通常更快更小。)@Hogan:我不明白你在说什么或指什么。@Hogan:对不起。我想你把我和别人搞混了。我没有回答这个问题,因为我不确定Block.BlockCopy是否是需要的,并且我不完全理解这个问题。然而,提问者显然有使用[,]的要求,建议某人替换实现并不是答案。因此,我投了反对票,并发表了评论来解释原因。我可以删除这个答案,但7年后我甚至都不会这么做。离开似乎很有用。有很多答案,所以正确的答案是“不要那样做”。假设一个答案是错误的,因为它从一个不同的方向看问题是错误的。我喜欢这种方法,但它对于我们的目的来说不够快,对不起。使用这种方法收益率将是非常好的唯一优化的答案!因此,
firstColumn
对于基于0的数组是0,对于基于1的数组是1?您得到的宽度和高度是混合的。谢谢。此解决方案的编辑和当前呈现的表示形式不是100%正确。你必须考虑到使用领域。如果将二维数组视为图像,则函数是正确的。但是如果你把它当作一个数学矩阵——我想应该是这样的——那么维度就必须被转换。在矩阵中,第一个参数是行数(高度别名y),第二个参数是列数(宽度别名x)。因此,请注意使用领域!对于数学函数,你必须在这个解决方案中切换“i”和“宽度”的参数位置。C++中使用C语言时的思维是一种痛苦。我多么想知道一个没有复制或锯齿阵列的解决方案。。。
array2D = new double[,];
// ... fill array here
var row = array2D.GetRow(4) // Implies getting 5th row of the 2-D Array