锯齿状阵列混乱

时间:2018-11-11 14:55:59

标签: c# arrays jagged-arrays

我想制作一个锯齿状的数组矩阵,该数组将存储9个1d数组,这些数组代表一个0-9的数字矩阵。我没有写所有从零到9的数字,但是它们都具有相同的大小,唯一的区别是1和0的位置。这部分是成功的,一旦我打印了InitializeMatrices()的结果,我确实得到了想要的结果。 matrices [0] [34] 将打印“零”矩阵的第35个元素, matrice [1] [2] 将打印“ one”的第3个元素矩阵等等。

问题开始于在DistortMatrices()内,我尝试在matrixToLearn内制作矩阵的副本(36个副本,其中索引0-17为零矩阵的副本),因此我将修改矩阵的单个副本而不是矩阵本身,并将更改存储在matrixToLearn内部。不幸的是,它似乎并没有我想象的那样起作用。例如

  

matrixToLearn [0] =矩阵[0]; //将其复制为零数组

     

matrixToLearn [0] [34] = 0; //它适用于矩阵[0] [34]以及matrixToLearn的所有18个副本,即使在此之后我调用:

     

matrixToLearn [17] [7] = 0 //它将应用于矩阵[0] [34],matrixToLearn [0] [34],并且所有副本都相同

因此,它似乎可以用作某种指针或smth。

我该如何修复它,以便将矩阵[0]复制到matrixtoLearn [0-17],而对matrixToLearn [0-17]的更改仅适用于自身及其对应的索引,而矩阵不变?在代码下查看---> 预期结果

public partial class Form1 : Form
{

    int[] zero, one, two, three, four, five, six, seven, eight, nine;

    int[][] matrices;
    int[][] matrixToLearn = new int[36][];


    private void InitializeMatrices()
    {
        zero =
        new int[] {
            1, 1, 1, 1, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 1, 1, 1, 1,
        };

        //And so on up to nine

        matrices = new int[][]{ zero, one, two, three, four, five, six, seven, eight, nine};
    }

    //index = 0
    private void DistortMatrices(int index)
    {
        int z = 0;
        for (; z < 18; z++)
        {
            matrixToLearn[z] = matrices[index];
        }
        matrixToLearn[0][34] = 0;
        matrixToLearn[17][7] = 1;
    }
}

预期结果

Expected result

            matrixToLearn[0]
            1, 1, 1, 1, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 1, 1, 1, 0,

            matrixToLearn[17] 
            1, 1, 1, 1, 1,
            1, 0, 1, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 1, 1, 1, 1,

            matrice[0] 
            1, 1, 1, 1, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 1, 1, 1, 1,

How it looks right now:

            matrixToLearn[0]
            1, 1, 1, 1, 1,
            1, 0, 1, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 1, 1, 1, 0,

            matrixToLearn[17]
            1, 1, 1, 1, 1,
            1, 0, 1, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 1, 1, 1, 0,

            matrices[0]
            1, 1, 1, 1, 1,
            1, 0, 1, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 1, 1, 1, 0,

编辑:它看起来更进一步,它也修改了“零”矩阵

1 个答案:

答案 0 :(得分:1)

matrixToLearn[0] = matrices[0];

这会将引用复制到嵌套数组。就像

float[] x = ...;
float[] y = x; //copies the reference, not the object contents

我通常使用(float[])myArray.Clone()克隆数组。我把它变成了一个通用的扩展方法。