为什么当我对它的副本的子数组进行排序时,交错数组的子数组会排序?
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
会导致从相同的单元格中获取值。
实际上只有 temporaryTriangle
和 triangle
的引用值(内存地址)不同:所有其他引用和内容在这些变量之间共享。
我有以下锯齿状数组-
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
会导致从相同的单元格中获取值。
实际上只有 temporaryTriangle
和 triangle
的引用值(内存地址)不同:所有其他引用和内容在这些变量之间共享。