2013-03-31 3 views
10

Я использовал этот код, чтобы скопировать один 2D массив в другой 2D массива:Копировать один 2D массив в другой массив 2D

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

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

ответ

14

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

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

Вот demo on ideone.

+0

спасибо за вашу помощь – user2079550

2

В соответствии с МС (http://msdn.microsoft.com/en-us/library/z50k9bft.aspx):

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

15

Вам нужно 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 
+0

Я предпочитаю этот ответ. Кроме того, я бы предложил, чтобы назначение выглядело так: double [,] copy = (double [,]) arr.Clone(); – zumalifeguard