Скопируйте один 2D-массив в другой 2D-массив

Я использовал этот код для копирования одного 2D-массива в другой 2D-массив:

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

Однако, когда я изменяю некоторые данные в tempPerformance, эти изменения также относятся к teamPerformance.
Что мне делать, чтобы контролировать это?

Ответ 1

Это правильно: Array.Copy выполняет мелкую копию, поэтому экземпляры массивов внутри внутреннего измерения копируются по ссылке. Вы можете использовать LINQ для создания копии, например:

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

Вот демон на ideone.

Ответ 2

Вам нужен 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

Ответ 3

Согласно MS (http://msdn.microsoft.com/en-us/library/z50k9bft.aspx):

Если sourceArray и destinationArray являются массивами ссылочного типа или являются массивами типа Object, выполняется неглубокая копия. Неглубокая копия массива - это новый массив, содержащий ссылки на те же элементы, что и исходный массив. Сами элементы или что-либо, на которые ссылаются элементы, не копируются. Напротив, глубокая копия массива копирует элементы и все, что прямо или косвенно ссылается на элементы.