【问题标题】:How can I split an 2d array of chars, into smaller arrays in c#?如何在 c# 中将 2d 字符数组拆分为更小的数组?
【发布时间】:2019-11-04 15:17:53
【问题描述】:

我有一个二维字符数组,我想将其拆分为更小的数组。二维数组是 4*4,我想把这个二维数组分成 4 个不同的数组。所有数组都有四个元素。

- For example I have this 2d array:
     1 2 5 6
     3 4 7 8
     4 4 4 7
     4 4 5 1
- And i want cut it for this arrays:
  [1,2,3,4] [5,6,7,8] [4,4,4,4] [4,7,5,1]

【问题讨论】:

  • 请尽快访问help center并学习How to Ask。
  • 请至少提供一些代码来说明您如何尝试解决此问题。此外,请不要张贴文字图片,至少尝试解释您要拆分矩阵的规则。通常当你这样做时,你实际上开始用自己的话描述解决问题的算法
  • 这个问题是一个有效的问题,但为了得到好的答案,最好遵循好帖子的规则。请edit问题并用代码块替换图像。请参阅formatting 了解更多信息。
  • 它是总是 4*4 并且你总是想要四个“象限”吗?或者不同大小的输入的预期输出是什么样的?
  • @xdtTransform - 看起来 OP 要求的是“象限”(或“子矩阵”),而不是行/列。

标签: c# arrays multidimensional-array


【解决方案1】:

天真的方法是循环遍历元素。

    static void Main(string[] args)
    {
        var matrix = new int[,] { 
            { 1, 2, 5, 6 },
            { 3, 4, 7, 8 },
            { 4, 4, 4, 7 },
            { 4, 4, 5, 1 }
        };

        var array11 = matrix.GetSubMatrixElements(0, 0, 2, 2);
        // [1, 2, 3, 4]
        var array12 = matrix.GetSubMatrixElements(0, 2, 2, 2);
        // [5, 6, 7, 8]
        var array21 = matrix.GetSubMatrixElements(2, 0, 2, 2);
        // [4, 4, 4, 4]
        var array22 = matrix.GetSubMatrixElements(2, 2, 2, 2);
        // [4, 7, 5, 1]
    }

    public static T[] GetSubMatrixElements<T>(this T[,] matrix, int startRow, int startCol, int rowCount, int colCount)
    {
        var array = new T[rowCount*colCount];

        int index = 0;
        for (int i = startRow; i < startRow+rowCount; i++)
        {
            for (int j = startCol; j < startCol+colCount; j++)
            {
                array[index++] = matrix[i, j];
            }
        }

        return array;
    }

如果您想要更快的结果,可以使用Buffer.BlockCopy() 代替内部循环。

    public static T[] GetSubMatrixElements<T>(this T[,] matrix, int startRow, int startCol, int rowCount, int colCount)
    {
        int n = matrix.GetLength(0), m = matrix.GetLength(1);
        var array = new T[rowCount*colCount];
        int u = Buffer.ByteLength(matrix)/(n*m);
        int index = 0;
        for (int i = startRow; i < startRow+rowCount; i++)
        {
            Buffer.BlockCopy(matrix, u*(i*m+startCol), array, u*index, u*colCount);
            index += colCount;
        }
        return array;
    }

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2019-06-21
    • 2016-09-25
    • 2022-08-16
    • 2022-07-07
    • 1970-01-01
    相关资源
    最近更新 更多