从C#中的特定多维数组中提取列

时间:2018-08-07 15:30:52

标签: c# multidimensional-array

尝试从数组中提取行时遇到麻烦。这是我的代码:

using System;

namespace C_sharp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!. This is the one !");

            dynamic[] res = new Object[3];

            res[0] = new int[2,2]{{3,2},{16,9}};
            res[1] = new int[2,2]{{4,7},{6,29}};
            res[2] = new int[2,2]{{30,29},{5,49}};

            //dynamic resultat = res[0][0];

        }
    }
}

如您所见,在程序结束时,本地变量res的内容如下所示:

[0] [dynamic]:{int[2, 2]}
[0, 0] [int]:3
[0, 1] [int]:2
[1, 0] [int]:16
[1, 1] [int]:9
[1] [dynamic]:{int[2, 2]}
[0, 0] [int]:4
[0, 1] [int]:7
[1, 0] [int]:6
[1, 1] [int]:29
[2] [dynamic]:{int[2, 2]}
[0, 0] [int]:30
[0, 1] [int]:29
[1, 0] [int]:5
[1, 1] [int]:49

现在,我只想将res[0]的第一行放入变量resultat中以获得一维数组。因此,在过程结束时,resultat应该等于:

[0] [int]:3
[1] [int]:2

我已经尝试过res[0][0,]res[0][0:]。他们都没有工作。有帮助吗?

1 个答案:

答案 0 :(得分:1)

您可以使用.Cast<int>()展平2d数组,然后使用.Take(2)获取第一行:

const int arraySize = 2;
var resultat = (res[0] as int[,]).Cast<int>().Take(arraySize).ToArray();

通常情况下,对于任意行索引,您可以使用.Skip(arraySize * rowIndex)

如果对您来说太慢了,您可以尝试Buffer.BlockCopy

const int rowSize = 2;
const int intSize = 4;

int[] resultat = new int[rowSize];
Buffer.BlockCopy(res[0], 0, resultat, 0, intSize * rowSize);

一般情况下是

const int intSize = 4; // Size of integer type in bytes

int[,] matrix = res[0];

int rowSize = matrix.GetLength(1); // Get size of second 2d-array dimension

int rowIndex = 0; // Index of a row you want to extract

int[] resultat = new int[rowSize];
Buffer.BlockCopy(res[0], // Copy source
            rowSize * intSize * rowIndex, // Source offset in bytes
            resultat, // Copy destination
            0,  // Destination offset
            intSize * rowSize); // The number of bytes to copy 

Buffer.BlockCopy documentation