2016-02-26 75 views
0

我正在嘗試製作一個動態大小的鋸齒陣列來表示一個非常簡單的控制檯遊戲的遊戲網格。嘗試編輯動態鋸齒陣列中的單個元素編輯多個

# Determine the size of the board. Enforce the size so as to not make it too large. 
$boardSize = 5 

# Game board characters 
[char]$bushCharacter = "#" 

# Initialize Game board object 
$gameBoard = ,(@($bushCharacter) * $boardSize) * $boardSize 

想法是,如果我要在屏幕上打印出來。我會得到像我這樣的東西。

0..($boardSize - 1) | ForEach-Object{$gameBoard[$_] -join ""} 

##### 
##### 
##### 
##### 
##### 

一切都很好,直到我試圖做出改變,以單個項目:$gameBoard[0][1] = "F"。從重印網格我預期的結果是

#F### 
##### 
##### 
##### 
##### 

我的實際輸出爲

#F### 
#F### 
#F### 
#F### 
#F### 

這告訴我,我做了數組引用對方的所有行。爲什麼這段代碼不會創建獨立的唯一數組?我能做些什麼改變才能實現。我知道其他方法可以像+=這樣的索引循環工作,但我認爲這種方法是一種更好的做法。

+0

我知道我靠近搞清楚了這一張給自己,但這個_seemed_是一個很好的問題。 – Matt

+0

外部數組的值全部引用相同的內部數組(比較'$ gameBoard [0] .GetHashCode()'和'$ gameBoard [1] .GetHashCode()') –

+0

@ MathiasR.Jessen假設儘可能多。不會有數字乘以它會做到這一點,但無論如何。你知道我會做什麼來改變它,或者我應該做一個不同的創作方法嗎? – Matt

回答

2

如果你看一下乘法運算(*)的文檔,你會發現,(從about_Arithmetic_Operators):

*   Multiplies integers; copies strings  6*2 
       and arrays the specified number of  "w" * 3 
       times. 

通知字副本

現在看看MSDN文檔的.NET Array.Copy() method,下備註部分:

如果sourceArraydestinationArray都是參考型陣列或是兩個陣列類型對象,執行淺拷貝。 Array的淺拷貝是一個新的Array,它包含對原始Array的相同元素的引用。元素本身或元素引用的任何內容都不會被複制。相比之下,Array的深層副本會複製由元素直接或間接引用的元素和所有內容。

公平地假設數組乘法運算總是產生相同類型的數組 - 即。無論是引用類型的數組還是Object數組(無論這是什麼) - 這基本上是你看到的效果。

我會怎麼做:

$gameBoard = 1..$boardSize |ForEach-Object { ,@(@($bushCharacter) * $boardSize) } 
2

Array是一個reference type正因爲如此,你只是乘以(複製)參考/指針,而不是內容本身。

解決方法:創建一個循環來生成唯一數組。

$gameBoard = 0..($boardSize - 1) | ForEach-Object{ ,(@($bushCharacter) * $boardSize) } 

您可以驗證(無文檔),對象是引用類型使用:

Add-Type -AssemblyName "Microsoft.VisualBasic" 
[Microsoft.VisualBasic.Information]::IsReference($gameBoard[0]) 
True 

#or as mentioned by Mathias 
-not $gameBoard[0].GetType().IsValueType 
True 
+0

您還可以檢查運行時類型是否爲不帶'Microsoft.VisualBasic'程序集的引用類型:'-not $ gameBoard [0] .GetType() .IsValueType' –

+0

不錯。以爲我以前看過一些簡單的東西:-) –