为什么当我对它的副本的子数组进行排序时,交错数组的子数组会排序?

Why does sub-arrays of a jagged array become sorted when I sort the sub-arrays of a copy of it?

我有以下锯齿状数组-

int[][] triangle = 
{
    new int[] {    3    },
    new int[] {   7,4   },
    new int[] {  2,4,6  },
    new int[] { 8,5,9,3 }
};

然后我复制了一份-

int[][] temporaryTriangle = new int[triangle.Length][];
Array.Copy(triangle, temporaryTriangle, triangle.Length);

并且我对副本的子数组进行了排序-

for (int i = 0; i < temporaryTriangle.Length; i++)
{
    Array.Sort(temporaryTriangle[i]);
}

我发现源数组的子数组也已经排序了! 我的问题是为什么会这样,我的意思是为什么当我对副本的子数组进行排序时,数组的子数组会被排序?

用法:

foreach (var subarray in triangle)
    Console.WriteLine(string.Join(" ", subarray));

foreach (var subarray in temporaryTriangle)
    Console.WriteLine(string.Join(" ", subarray));

// Output:
// 3
// 4 7
// 2 4 6
// 3 5 8 9
// 3
// 4 7
// 2 4 6
// 3 5 8 9

我问的是什么问题,而不是如何解决。所以 Extremely fast way to clone the values of a jagged array into a second array? 没有回答我的问题。

虽然你认为你复制了那个数组(事实上你做了),但你只是深度复制了外部数组,并且每个元素都是通过引用复制的。您应该循环新数组,并将前一个数组的每个元素深复制到其中。

看来,您并没有复制子数组元素,您只是复制了 triangle 中每个数组的引用。您可以使用此代码确认它

for (int i = 0; i < triangle.Length; i++)
{
    var result = ReferenceEquals(triangle[i], temporaryTriangle[i]);
}

它 returns true 每次迭代。因此,在您的情况下,您应该手动复制每个元素

[ *pointerToArray, *pointerToArray2, *pointerToArray3 ]

复制时,您只复制引用/指针,而不是实际的数组本身。

您还必须复制内部数组。

Array.Copy 仅复制单元格数组的第一级,即对子数组的引用数组...因此仅复制这些引用。

因此,作为重复问题提供的 link 通过对每个子叶进行深层复制来解决问题。

您需要克隆每个子数组等等:如果您有一个 [][][]... 锯齿状数组,您需要管理树的每个级别,一个分支一个分支,用 [= 复制每个级别10=] 与另一个 Array.Copy.

的叶子

因此,如果您只复制第一层,然后如果您使用 temporaryTriangle 修改叶子,读取 triangle 会导致从相同的单元格中获取值。

实际上只有 temporaryTriangletriangle 的引用值(内存地址)不同:所有其他引用和内容在这些变量之间共享。