2017-03-15 105 views
0

我已經在C#中實現了插入排序算法。該方法返回選擇一個List<List<string>>其中記錄了所有的步驟和改變的List經歷,變量等C#:將項目添加到列表時,之前的列表項目也會被項目覆蓋。爲什麼?

這裏是方法:

public List<List<int>> SortStepByStep(List<int> set) 
{ 
    List<List<int>> steps = new List<List<int>>(); 
    steps.Add(set); 

    for (int c1 = 1; c1 < set.Count; c1++) 
    { 
     Console.WriteLine(steps[0][0].ToString()); 

     int item = set[c1]; 

     set.Add(item); 
     steps.Add(set); 
     set.RemoveAt(set.Count - 1); 
     // ^^^^ This is just to visually display what number is being selected. 

     set.RemoveAt(c1); 

     steps.Add(set); 

     bool inserted = false; 
     for (int c2 = 0; c2 < c1; c2++) 
     { 
      if ((set[c2] > item || c2 == c1 - 1) && !inserted) 
      { 
       set.Insert((set[c2] <= item && (c2 == c1 - 1) ? c2 + 1 : c2), item); 
       steps.Add(set); 
       inserted = true; 
       break; 
       // Added the break in anyway because sometimes the inserted boolean failed to work. 
      } 
     } 
    } 
    return steps; 
} 

這一方法實際上返回僅僅是最後的分類列出每個'步驟'的索引。我已經通過將「步驟」寫入控制檯並可以看到它逐漸改變,但不明白爲什麼。

其他答案提到在for循環內實例化,但我不認爲這適用於此。

可能是什麼問題?

+1

問題是,您正在將一個和相同的列表對象**引用**添加到「steps」(它不會爲您製作副本)。替換** all **'steps.Add(set);'with'steps.Add(set.ToList());' –

+1

非常感謝你,我不明白它是如何工作的。謝謝你爲我節省了很多時間! –

回答

1

您的步驟列表控股引用到相同的集合。因此,一旦修改集合步驟的每個元素都將顯示更新的值(它們指向相同的對象)。

嘗試更改steps.Add(set);steps.Add(set.ToList())steps.Add(new List<int>(set)),應該創建新列表而不是引用舊列表。

+0

非常感謝答案,我需要仔細閱讀理論/ MSDN頁面! –