我使用下面的代码将一个2D数组复制到另一个2D数组:
Array.Copy(teamPerformance, 0,tempPerformance,0, teamPerformance.Length);
然而,当我改变tempPerformance
中的一些数据时,这些变化也适用于teamPerformance
。
我该怎么控制呢?
你需要克隆()
double[,] arr =
{
{1, 2},
{3, 4}
};
double[,] copy = arr.Clone() as double[,];
copy[0, 0] = 2;
//it really copies the values, not a shallow copy,
//after:
//arr[0,0] will be 1
//copy[0,0] will be 2
这是正确的:Array.Copy
执行浅复制,因此内部维度内的数组实例通过引用复制。您可以使用LINQ进行复制,如下所示:
var copy2d = orig2d.Select(a => a.ToArray()).ToArray();
根据MS(http://msdn.microsoft.com/en-us/library/z50k9bft.aspx):
如果sourceArray和destinationArray都是引用类型的数组或都是Object类型的数组,则执行浅拷贝。数组的浅拷贝是一个新的数组,它包含对原始数组相同元素的引用。元素本身或元素引用的任何内容都不会被复制。相反,数组的深度拷贝复制元素以及元素直接或间接引用的所有内容。
从我对阅读问题的理解来看,我假设数组中充满了引用类型,但是c#并没有提供一种"只是复制"的方法。一个引用类型。它只会将引用复制到对象(因此,两个东西将指向相同的东西)。
因此,将引用类型放入数组中,然后复制该数组,将不会只是"复制引用类型(因为c#不能这样做,无论是否在数组内)。
这就是为什么这里给出的答案都不能解决问题。Sheng的答案是正确的(但并不能解决问题),而且可能需要更多的解释。
如果你想要复制引用类型,你应该研究这样做的方法。比如,将它们与JSON进行转换,或者自己创建一个复制方法,可能是通过使用反射。
您也可以使用:
int[] copy = new int[old.Length];
Buffer.BlockCopy(old, 0, copy, 0, old.Length * 4];
注意,您必须知道要复制的字节数。除此之外,我也很确定这是非常性能的。