【问题标题】:Copy Arrays to Array将数组复制到数组
【发布时间】:2022-01-12 22:27:45
【问题描述】:

我对数组有一点问题。我是 C# 新手。

我尝试将int 数组复制到另外两个int 数组中

unsortedArray = randomNumbers();

unsortedArray2 = unsortedArray;
unsortedArray3 = unsortedArray;

但是,如果我对 unsortedArray2 进行排序,unsortedArray3 也会被排序。

有人可以帮我吗?

【问题讨论】:

  • 您可能需要阅读“按值传递”和“按引用传递”以了解发生这种情况的原因。
  • 您对同一个数组有三个引用。所以你所有的三个变量都指向同一个数组。通过一个变量操作数组也会使更改通过其他变量可见。
  • 我在我的应用程序中使用了数千个数组,直到今天才遇到问题。我想知道这怎么可能。

标签: c# arrays copy


【解决方案1】:

我尝试将一个 Int 数组复制到其他 2 个 Int 数组中

首先重要的是这一行:

unsortedArray2 = unsortedArray;

您不要将unsortedArray 的值复制到unsortedArray2= 称为 assignment operator

赋值运算符 (=) 将其右侧操作数的值存储在存储位置,

现在要理解这种现象,你需要知道的第二件事是 C# 中有两种类型的对象Reference Types 和值类型

文档实际上很好地解释了它:

引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。使用引用类型,两个变量可以引用同一个对象;因此,对一个变量的操作会影响另一个变量引用的对象。

解决方法可以是使用Array.Copy方法。

Array.Copy(unsortedArray, 0, unsortedArray2 , 0, unsortedArray.Length);

CopyTo 方法也适用于这种情况

unsortedArray.CopyTo(unsortedArray2 , 0);

注意:这会起作用,因为数组的内容是值类型!如果它也是引用类型,则更改其中一项的子值也会导致目标数组中相同项的更改。

【讨论】:

    【解决方案2】:

    您遇到的问题不是 C# 特定的。这种行为几乎在任何编程语言(JS/Java/Python/C)中都是相同的。变量unsortedArray2unsortedArray3 指向同一个内存块,当您对数组重新排序时,您只需使用该内存块进行操作。

    考虑到这一点,我们需要什么来实现您的目标?我们需要复制数组。它可以通过多种方式完成

    1. Array.Copy
    Array.Copy(unsortedArray, 0, unsortedArray2 , 0, unsortedArray.Length);
    // The CopyTo method would also work in this case
    unsortedArray.CopyTo(unsortedArray2 , 0);
    
    1. 在 for 循环中创建新数组并一一复制元素
    var unsortedArray2 = new int[unsortedArray.Length];
    for (int i = 0; i < unsortedArray.Length; i++)
    {
        unsortedArray2[i] = unsortedArray[i];
    }
    
    1. 林克
    var unsortedArray2 = unsortedArray.Clone();
    

    注意:这些操作是 shallow copy,这适用于您的情况,因为内容是值类型,而不是引用类型。

    【讨论】:

    • 通常我在 SAP ABAP 中编程并且没有仅数组表:)
    【解决方案3】:

    你可以使用 Array.Copy:

    unsortedArray = randomNumbers();
    
    Array.Copy(unsortedArray, unsortedArray2 , unsortedArray.Length);
    Array.Copy(unsortedArray, unsortedArray3 , unsortedArray.Length);
    

    【讨论】:

    • "你可以使用 Array.Copy:" 做什么?为什么这会解决问题?为什么首先会出现问题?
    【解决方案4】:

    数组是一个引用类型,所以当你对第一个排序时,神奇的是第二个被排序。 如果你想避免你必须复制你的数组(使用复制方法)。

    【讨论】:

      【解决方案5】:

      虽然这可能无法回答您的名义问题,但您可以使用List

      List<int> unsortedArray2 = unsortedArray.ToList();
      

      这样做意味着您不需要知道要复制的数组的大小,也不必担心它会存储引用,而且使用起来比说要容易得多:

      int[] unsortedArray2 = new int[unsortedArray.Length];
      unsortedArray.CopyTo(unsortedArray2, 0);
      

      【讨论】:

        【解决方案6】:
        unsortedArray = randomNumbers();
        
        unsortedArray2 = unsortedArray.Clone;
        unsortedArray.CopyTo(unsortedArray2, 0);
        
        unsortedArray3 = unsortedArray.Clone;
        unsortedArray.CopyTo(unsortedArray3, 0);
        
        Array.Sort(unsortedArray2);
        

        【讨论】:

        • 您的回答没有任何解释。转储代码应该如何帮助开始学习该语言的人?=!
        猜你喜欢
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 2017-09-13
        • 2021-12-09
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多