将数组复制到另一个数组

25

我在数组方面遇到了一点问题。 我是C#的新手。

我尝试使用以下方法将int数组复制到另外两个int数组中:

unsortedArray = randomNumbers();

unsortedArray2 = unsortedArray;
unsortedArray3 = unsortedArray;

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

有人能帮帮我吗?


3
Array.Copy方法 https://msdn.microsoft.com/zh-cn/library/system.array.copy(v=vs.110).aspxArray.Copy 方法可以从一个源数组将元素复制到另一个目标数组。 源数组和目标数组可以有不同的大小。 可以选择性地指定源数组中要复制的起始索引位置,以及目标数组中要放置复制结果的起始索引位置。 语法:Array.Copy(Array sourceArray, Array destinationArray, int length);参数: sourceArray:要复制元素的源一维数组。 destinationArray:接收源一维数组元素副本的目标一维数组。 length:要复制的源数组元素数。示例:int[] source = {1, 2, 3, 4, 5}; int[] target = new int[5]; Array.Copy(source, target, 5); // 输出: target数组中的元素为1 2 3 4 5 for (int i = 0; i < target.Length; i++) { Console.Write(target[i] + " "); } - tym32167
你可能想了解一下“传值调用”和“传引用调用”,以了解为什么会发生这种情况。 - waka
你有三个指向同一数组的引用。因此,你的三个变量都指向同一个数组。通过一个变量操作数组也会使更改通过其他变量可见。 - Oliver
我在我的应用程序中使用了成千上万的数组,直到今天从未遇到过问题。我想知道这是怎么可能的。 - user14803978
7个回答

32

我试图将一个整数数组复制到另外两个整数数组中

重要的第一件事是在这行代码中:

unsortedArray2 = unsortedArray;

你没有将unsortedArray的值复制到unsortedArray2中。 = 被称为赋值运算符

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

要理解此现象所需了解的第二件事是,C#中有两种类型的对象:引用类型和值类型

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

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

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

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

在这种情况下,CopyTo 方法也可以使用。

unsortedArray.CopyTo(unsortedArray2 , 0);

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


4
您正在面临的问题并不是特定于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. Linq
var unsortedArray2 = unsortedArray.Clone();

注意:这些操作是浅拷贝,因为内容是值类型而不是引用类型,所以在您的情况下会起作用。请参阅深度复制与浅复制了解详情。

通常我使用SAP ABAP编程,那里没有数组,只有表格 :) - ARX

1
你可以使用 Array.Copy:
unsortedArray = randomNumbers();

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

你可以使用 Array.Copy: 做什么?为什么这样做可以解决问题?为什么问题一开始会出现? - Mong Zhu

0
数组是引用类型,因此当您对第一个数组排序时,第二个数组也会神奇地排序。 如果想要避免这种情况,您必须复制数组(使用copy方法)。

0

这对我来说可行,我认为这更容易。

int[] unsortedArray = randomNumbers();

int[] unsortedArray2 = unsortedArray.ToArray();
int[] unsortedArray3 = unsortedArray.ToArray();

0

虽然这可能不能回答你的标题问题,但你可以使用List

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

这样做意味着您不需要知道要复制的数组的大小,也不需要担心它存储引用,而且比如下面这种方式使用起来更加容易:
int[] unsortedArray2 = new int[unsortedArray.Length];
unsortedArray.CopyTo(unsortedArray2, 0);

-3
unsortedArray = randomNumbers();

unsortedArray2 = unsortedArray.Clone;
unsortedArray.CopyTo(unsortedArray2, 0);

unsortedArray3 = unsortedArray.Clone;
unsortedArray.CopyTo(unsortedArray3, 0);

Array.Sort(unsortedArray2);

5
你的回答完全没有解释。倾倒代码如何帮助那些刚开始学习语言的人? - Mong Zhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接