将一个二维数组复制到另一个二维数组

问题描述 投票:0回答:5

我使用此代码将一个二维数组复制到另一个二维数组:

Array.Copy(teamPerformance, 0,tempPerformance,0, teamPerformance.Length);

但是,当我更改

tempPerformance
中的一些数据时,这些更改也适用于
teamPerformance

我应该做什么来控制它?

c# arrays multidimensional-array
5个回答
70
投票

你需要 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

21
投票

这是正确的:

Array.Copy
执行复制,因此内部维度内的数组实例通过引用复制。您可以使用 LINQ 进行复制,如下所示:

var copy2d = orig2d.Select(a => a.ToArray()).ToArray();

这是 ideone 上的演示


3
投票

根据 MS(http://msdn.microsoft.com/en-us/library/z50k9bft.aspx):

如果sourceArray和destinationArray都是引用类型数组或者都是Object类型数组,则执行浅拷贝。数组的浅表副本是一个新数组,其中包含对与原始数组相同的元素的引用。元素本身或元素引用的任何内容都不会被复制。相比之下,数组的深层复制会复制元素以及元素直接或间接引用的所有内容。


2
投票

根据我阅读问题的理解,我假设数组中充满了引用类型,但 C# 没有提供“仅复制”引用类型的方法。它只会将 reference 复制到对象(因此,两个事物将指向同一个事物)。

因此,将引用类型放入数组中,然后制作该数组的副本,将不会“仅仅”制作引用类型的副本(因为 C# 无法做到这一点,无论是否在数组内)。

这就是为什么这里给出的答案中有 0 个可以解决问题。盛的回答是正确的(但不会解决问题) - 并且可能需要更多解释。

如果您想复制引用类型,您应该研究具体的方法。例如,将它们与 JSON 相互转换,或者自己创建一个复制方法,也许可以使用反射。


0
投票

您还可以使用:

int[] copy = new int[old.Length];
Buffer.BlockCopy(old, 0, copy, 0, old.Length * 4];

请注意,您必须知道要复制的字节数。除此之外,我也很确定这是非常高效的。

© www.soinside.com 2019 - 2024. All rights reserved.