【问题标题】:Why does sub-arrays of a jagged array become sorted when I sort the sub-arrays of a copy of it?为什么当我对锯齿状数组的子数组进行排序时,它的子数组会被排序?
【发布时间】:2020-10-26 19:12:16
【问题描述】:

我有以下锯齿状数组-

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? 没有回答我的问题。

【问题讨论】:

标签: c# arrays sorting jagged-arrays


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Array.Copy 仅复制单元格数组的第一级,即对子数组的引用数组...所以只有这些引用是重复的。

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

    您需要克隆每个子数组等:如果您有一个[][][]... 锯齿状数组,您需要逐个分支地管理树的每个级别,将每个级别与Array.Copy 复制到叶子和另一个Array.Copy。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        [ *pointerToArray, *pointerToArray2, *pointerToArray3 ]

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

        您还必须复制内部数组。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-21
          • 2011-03-27
          • 2011-10-09
          • 2017-03-14
          • 2023-01-10
          • 2011-12-31
          相关资源
          最近更新 更多