我使用此代码将一个二维数组复制到另一个二维数组:
Array.Copy(teamPerformance, 0,tempPerformance,0, teamPerformance.Length);
但是,当我更改
tempPerformance
中的一些数据时,这些更改也适用于 teamPerformance
。你需要 Clone()
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();
这是 ideone 上的演示。
根据 MS(http://msdn.microsoft.com/en-us/library/z50k9bft.aspx):
如果sourceArray和destinationArray都是引用类型数组或者都是Object类型数组,则执行浅拷贝。数组的浅表副本是一个新数组,其中包含对与原始数组相同的元素的引用。元素本身或元素引用的任何内容都不会被复制。相比之下,数组的深层复制会复制元素以及元素直接或间接引用的所有内容。
根据我阅读问题的理解,我假设数组中充满了引用类型,但 C# 没有提供“仅复制”引用类型的方法。它只会将 reference 复制到对象(因此,两个事物将指向同一个事物)。
因此,将引用类型放入数组中,然后制作该数组的副本,将不会“仅仅”制作引用类型的副本(因为 C# 无法做到这一点,无论是否在数组内)。
这就是为什么这里给出的答案中有 0 个可以解决问题。盛的回答是正确的(但不会解决问题) - 并且可能需要更多解释。
如果您想复制引用类型,您应该研究具体的方法。例如,将它们与 JSON 相互转换,或者自己创建一个复制方法,也许可以使用反射。
您还可以使用:
int[] copy = new int[old.Length];
Buffer.BlockCopy(old, 0, copy, 0, old.Length * 4];
请注意,您必须知道要复制的字节数。除此之外,我也很确定这是非常高效的。