我已經在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循環內實例化,但我不認爲這適用於此。
可能是什麼問題?
問題是,您正在將一個和相同的列表對象**引用**添加到「steps」(它不會爲您製作副本)。替換** all **'steps.Add(set);'with'steps.Add(set.ToList());' –
非常感謝你,我不明白它是如何工作的。謝謝你爲我節省了很多時間! –