2011-03-23 126 views
0

我有這樣的方法:問題與陣列算法

public bool CantMoveIfCreatedCheck(Pieces[,] pieces, int rowStart, int columnStart, 
int rowEnd, int columnEnd) 

{ 
    pieces[rowEnd, columnEnd] = pieces[rowStart, columnStart]; 
    // shift one piece to another location 
     pieces[rowStart, columnStart] = null; 

    if (whitePiece) 
    { 
     for (int z1 = 0; z1 < 9; z1++) 
     { //Find Threatening piece 
      for (int j = 0; j < 9; j++) 
      { 
       if (pieces != null && pieces[whitekingRow, whitekingColumn] != null))// i have some check algorithm 
       { 
        canCheck = true; 
        chess.YouWillBeCheckedCantMove(); 
       } 
      } 
     } 
    } 
    pieces[rowStart, columnStart] = pieces[rowEnd, columnEnd];// shift it back to the end location 
    pieces[rowEnd, columnEnd] = null; 

    return canCheck; 
} 

我想在這裏做的,就是隨時更改數組中的棋子位置,並將它們移回剛過兩個循環完成。

但是因爲一切都通過引用與數組/對象一起工作,所以數組中一個位置上的塊移動到數組的另一個位置會產生問題。有沒有辦法以某種方式改變一個陣列到另一個陣列,而不影響原有的陣列

例如,創建temperoryArray[,]=pieces[,]; (它沒有工作對我來說,因爲它複製引用,並影響了塊陣列)。

有沒有其他的方法?

回答

3

爲了將數組複製到臨時數組中,您需要深層複製數組內的對象,而不是淺拷貝(僅使用賦值)引用。 Here's關於在C#中進行深層複製的好貼子。

既然你有一個對象數組(真的,這是一個引用數組),賦值只是複製引用。

+0

爲什麼我要序列化,告訴你我想要它是一個淺拷貝的真相,不會影響我的對象數組,因爲我對數組進行的每一個操作都會影響該數組。它只是存儲在內存中,而不是像原始變量。我需要一個臨時數組,操作而不操作其他數組,這就是我的目標 – 2011-03-23 09:28:21

+0

我作爲參數傳遞方法是什麼? DeepClone (件);如果你想創建一個數組副本和一個引用副本,這個工作不起作用 – 2011-03-23 09:42:48

+0

,你可以使用'CopyTo()'方法創建一個不同的具有相同引用的臨時數組。然後可以修改臨時數組而不修改原始數組。但是,如果修改臨時數組內的對象,則還將修改原始對象內的對象。 – 2011-03-23 19:22:54