2017-08-09 73 views
0

有一個數組和一個相同類型的列表。在一個循環中,我更改了數組,並在每次更改之後將其添加到列表中(在循環結束時,我想獲取由更改導致的所有數組的列表)。但是,當列出所有元素相同時,它們與添加到列表中的最後一個數組相同。這是爲什麼發生?將數組添加到列表中而不重複

 byte[,] mat = new byte[3, 3]; 
     List<byte[,]> list = new List<byte[,]>(); 

     for (int m = 0; m < 9; ++m) 
     { 
      byte i = 0; 
      byte j = 0; 

      // Search for an empty cell (zero) 
      bool flag = false; 
      for (i = 0; i < 3; ++i) 
      { 
       for (j = 0; j < 3; ++j) 
        if (mat[i, j] == 0) 
        { 
         flag = true; 
         break; 
        } 
       if (flag) break; 
      } 

      // Adding a changed array to the list 
      mat[i, j] = 1; 
      list.Add(mat); 

      // List all items in the list 
      foreach (byte[,] a in list) 
      { 
       PrintMatrix(a); 
      } 
     } 
+0

應該'墊[I,J] = 1;'是你'標誌前右= TRUE;' ?因爲我和j在for循環之外沒有變化,所以你總是使0,0位置1。 –

+0

不是一個答案,但我可以強烈建議你不要命名一個List'list'嗎? 'mats'? 'listMats'? 'matList'? – zzxyz

回答

2

mat是一個對象。在循環中,您繼續將同一個對象mat添加到List。完成後,您將擁有一個List,其中包含指向一個對象mat的多個指針,它們是相同的。

想象一下郵局的郵箱編號。其中一個框(例如15)是您的matArray變量。所以在我們的類比mat是15.你的Listlist是一張紙。每次在循環中你都會在郵箱中放入不同的東西,然後在紙的底部寫上15。

當你拿出最終的論文,去每個郵箱看看裏面的內容時,你只需要繼續閱讀15並看到相同的內容。

順便說一句,我認爲你的打印循環處於錯誤的位置 - 它應該在m循環之外。

爲了解決這個問題,你需要做的mat副本並將其添加到List

var mat = new byte[3, 3]; 
var list = new List<byte[,]>(); 

for (int m = 0; m < 9; ++m) { 
    byte i, j = 0; 

    // Search for an empty cell (zero) 
    bool flag = false; 
    for (i = 0; i < 3; ++i) { 
     for (j = 0; j < 3; ++j) 
      if (mat[i, j] == 0) { 
       flag = true; 
       break; 
      } 
     if (flag) break; 
    } 

    // Adding a changed array to the list 
    mat[i, j] = 1; 
    list.Add((byte[,])mat.Clone()); 

} 

// List all items in the list 
foreach (byte[,] a in list) { 
    PrintMatrix(a); 
} 
+0

這是什麼意思'$「flag == {flag}」。Dump();'? – zRirez

+0

對不起,我使用LINQPad進行試用代碼,並留下一些調試內容。 – NetMage

相關問題